【问题标题】:Subtract a generic list from another从另一个列表中减去一个通用列表
【发布时间】:2018-06-26 22:33:10
【问题描述】:

我正在尝试从另一个列表中删除一个公司 ID 列表。 我不太了解 linq,但我很确定我需要使用它。

List<Firm> firms = GetBusinessDevelopmentFirms(database);
List<Firm> trackedFirms = GetAllCLIFirmsBeingTrackedByUser();

var result = firms.Contains(i => trackedFirms.Contains(i.FirmID));

最后一行不起作用,系统显示“未知方法包含(?)”,即使我已经输入“使用 System.Linq;”名列前茅。

我的想法是从所有公司列表中删除跟踪公司的列表,以找到未跟踪的公司。

我希望这是有道理的。

【问题讨论】:

    标签: c# linq


    【解决方案1】:
    var result = firms.Except(trackedFirms); // returns all the firms except those in trackedFirms
    

    【讨论】:

    • 这种方法的唯一问题是,您希望在两个列表中都持有相同的 Firm 实际实例...
    • 倒不是真的很重要,但需要注意的是这不是Linq,而是一个现有的method on List<T>
    • 为抬头干杯,如果我不必使用 Linq,那很好。总有一天我会明白的。当网站允许时,我会将其标记为我的答案。祝大家好运
    • 你是对的。但请注意,编译器实际上将 linq 查询转换为相应的扩展方法。所以他们之间没有太大的区别。此外,OP 问题的最后一行暗示了他想要什么。
    • @RGraham 不,您刚刚链接到 Linq 方法,您只是从 List&lt;T&gt; 页面上的扩展方法部分链接到它。 List&lt;T&gt; 没有实例 Except 方法。如果您在该页面上选择其中一个重载,您将看到它们定义的命名空间是 System.Linq,并且第一个参数是 IEnumerable&lt;T&gt; 而不是 List&lt;T&gt;
    【解决方案2】:

    根据您上面的代码,我认为您正试图从在 TrackedFirms 中有相应项目的公司获取条目。

    List<Firm> results = Firms.Where(f => TrackedFirms.Any(t => t.FirmId == f.FirmId)).ToList();
    

    另一方面,如果您想要未跟踪的公司,那么它是:

    List<Firm> results = Firms.Where(f => !TrackedFirms.Any(t => t.FirmId == f.FirmId)).ToList();
    

    【讨论】:

      【解决方案3】:

      我认为这应该可行

      var result = firms.Where(x => !trackedFirms.Any(y => x.FirmID == y.FirmID));
      

      firms 中的所有公司中选择trackedFirms不是的公司(至少这是我从您的问题中了解到的)。

      【讨论】:

        【解决方案4】:

        ContainsList&lt;T&gt; 的本机方法,它希望您传入T。你想要Where

        var result = firms.Where(i => trackedFirms.Contains(i.FirmID));
        

        如果您希望resultList&lt;T&gt;,则将.ToList() 添加到Where LINQ 表达式的末尾。

        【讨论】:

        • 虽然我的答案与您的问题最相关,但我真的更喜欢这个答案:stackoverflow.com/a/18895816/1795053 如果您只是将.ToList() 添加到他的答案中,您将得到相同的结果。或者,如果您更喜欢知道交叉点,那么Intersect 结果之一。你的目标是什么更精确和更明显。我会考虑接受他们的答案之一。祝你好运!
        • 1) 这是两个列表的交集,而不是另一个列表的减法。 2)您正在对每个项目进行线性搜索,这比使用更好的算法时要慢得多。
        【解决方案5】:

        对于您的情况,最好的方法是Except()。但是,如果 List 对象与其他对象不同,则可以使用 All()

        firms.Where(x=> trackedFirms.All(y => y.FirmId != x.FirmId)
        

        【讨论】:

          【解决方案6】:

          如果您有列表 X 和列表 Y,并且您想删除 Y 中 X 中的所有项目,您可以尝试以下操作:

          X.Intersect(Y)

          Comparing two Lists and returning the distinct values and the differences

          【讨论】:

          • 相交未设置减法。
          猜你喜欢
          • 1970-01-01
          • 2015-07-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多