如何比较两个通用集合

时间:2015-11-30 09:09:47

标签: c# linq

我有两个名为barcodesSource和barcodesTarget的通用集合。它们都是同一类型的助手。我想比较名为barcodesSource的集合和基于属性BARCODE的第二个集合,并仅返回第一个集合中的数据,这些集合在第二个集合中没有相应的BARCODE。

任何人都可以告诉我这方面的解决方案吗?

class Helper
{
    public long BARCODE { get; set; }
    public int ITEM { get; set; }
}


List<Helper> barcodesSource = new List<Helper>();
List<Helper> barcodesTarget = new List<Helper>();

var distinctBarcodes = barcodesSource.Where(a => barcodesTarget.All(b => b.BARCODE != a.BARCODE));

5 个答案:

答案 0 :(得分:5)

使用Any

var distinctBarcodes = barcodesSource.Where(a => !barcodesTarget.Any(b => b.BARCODE == a.BARCODE));

答案 1 :(得分:1)

您可以在Lambda Expression中使用Join来获取相同的Helper对象。

barcodesSource.Join(barcodesTarget, x=> new {x.BARCODE, x.ITEM}, y=> new {y.BARCODE, y.ITEM}, (x,y)=> x);

您可以使用此辅助方法获取不同的对象:

public static IEnumerable<TOuter> NotJoin<TOuter, TInner, TKey>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector)
    where TInner : class
    where TOuter : class
{
    IEnumerable<TOuter> results = from o in outer join i in inner on outerKeySelector(o) equals innerKeySelector(i) into joinData from left in joinData.DefaultIfEmpty() where left == null select o;
    return results;
}

barcodesSource.NotJoin(barcodesTarget, x=> new {x.BARCODE, x.ITEM}, y=> new {y.BARCODE, y.ITEM});

答案 2 :(得分:0)

您可以使用LINQ .Except()方法和自定义Comparer类:

   class Helper
    {
        public string barCode;
    }

    class MyComparer : IEqualityComparer<Helper>
    {
        public bool Equals(Helper x, Helper y)
        {
            return x.barCode == y.barCode;
        }

        public int GetHashCode(Helper obj)
        {
            return obj.GetHashCode();
        }
    }

    class Class1
    {
        static void Main()
        {
            List<Helper> bcs1 = new List<Helper>()
            {
                new Helper() { barCode = "0001" },
                new Helper() { barCode = "0002" },
                new Helper() { barCode = "0003" },
                new Helper() { barCode = "0004" }
            };

            List<Helper> bcs2 = new List<Helper>()
            {
                new Helper() { barCode = "0001" },
                new Helper() { barCode = "0002" },
                new Helper() { barCode = "0003" }
            };

            bcs1 = bcs1.Except(bcs2, new MyComparer()).ToList();

            Console.WriteLine(bcs1.Count);    
            Console.WriteLine(bcs1.First().barCode);

            Console.ReadKey();
        }
    }

输出: 1 0004

答案 3 :(得分:0)

使用HashSet<>.Contains的另一种基于集合的方法:

var barcodes = new HashSet<long>(barcodesTarget.Select(b => b.BARCODE));
var distinctBarcodes = barcodesSource.Where(a => !barcodes.Contains(a.BARCODE));

答案 4 :(得分:0)

一种选择是使用集合操作,即

var result = new HashSet<Helper>(barcodesSource);
result.ExceptWith(barcodesTarget);