【问题标题】:Get the difference between two lists using LINQ使用 LINQ 获取两个列表之间的差异
【发布时间】:2011-09-08 11:33:03
【问题描述】:

我有两个列表,我需要比较它们,并且只返回一个不在两者中的项目列表。

var listOfIds = new List<int> {1,2,4};

var persons = new ObservableCollection<Person>
{
    new Person {Id = 1, Name = "Person 1"},
    new Person {Id = 2, Name = "Person 2"},
    new Person {Id = 3, Name = "Person 3"},
    new Person {Id = 4, Name = "Person 4"}
};

在此示例中,new Person {Id = 3, Name = "Person 3"} 将是结果。 最好使用 Linq 解决方案。

【问题讨论】:

    标签: c# .net linq list


    【解决方案1】:

    不适合你

    var listOfIds = new List<int> {1,2,4};
    
    var query = from item in persons 
                where !listOfIds .Contains( item.id )
                select item;
    

    您可以查看更多详细信息:SQL to LINQ ( Case 7 - Filter data by using IN and NOT IN clause)

    【讨论】:

    • 非常感谢,总是忘记怎么做 :-)
    • 有一个函数Except,不仅更干净,而且速度更快。
    【解决方案2】:

    你也可以使用 lambda:

    var query = persons.Where(item => !listOfIds.Contains(item.Id));
    

    【讨论】:

      【解决方案3】:
      var list1 = new List<int> {1,2,3,4,5};
      var list2 = new List<int> {2,3,4,5,6};
      
      list1.Except(list2); //1 - items removed
      list2.Except(list1); //6 - items added
      

      【讨论】:

        【解决方案4】:

        使用 C# 中的 Linq,您可以执行以下变体,得到相同的结果:

        int[] numbers1 = { 1,2,3,4 };
        int[] numbers2 = { 3,4,5,6 };
        
        // Ac V Bc, thus complement of A plus the complement of B
        IEnumerable<int> differencesVariant1 = 
        numbers1.Except(numbers2).Union(numbers2.Except(numbers1));
        
        // (A V b)c, thus complement of (set A plus set B)
        IEnumerable<int> differencesVariant2 = 
        numbers1.Union(numbers2).Except(numbers1.Intersect(numbers2));
        
        Console.WriteLine("variant 1:");
        foreach (int number in differencesVariant1)
            Console.WriteLine(number);   // prints: 1,2,5,6
        
        Console.WriteLine("variant 2:");
        foreach (int number in differencesVariant2)
            Console.WriteLine(number);   // prints: 1,2,5,6
        

        【讨论】:

          【解决方案5】:

          10 年后。您可以编写自己的扩展方法。这样您就不必担心哪个集合的长度最长。

          public static IEnumerable<T> Difference<T>(this IEnumerable<T> set1, IEnumerable<T> set2)
              {
                  IEnumerable<T> biggerSet = set2;
                  IEnumerable<T> smallerSet = set1;
                  if(set1.Count() > set2.Count())
                  {
                      biggerSet = set1;
                      smallerSet = set2;
                  }
                  return biggerSet.Except(smallerSet);
              }
          

          【讨论】:

            猜你喜欢
            • 2011-03-28
            • 1970-01-01
            • 2020-10-30
            • 2019-05-12
            • 2018-06-22
            • 2013-11-14
            • 2014-10-09
            相关资源
            最近更新 更多