如何比较两个通用集合

本文关键字:两个 集合 比较 何比较 | 更新日期: 2023-09-27 18:25:11

我有两个名为barcodesSource和barcodesTarget的通用集合。它们都是相同类型的Helper。我想根据属性BARCODE将名为barcodesSource的集合和第二个集合进行比较,并只返回第一个集合的数据,而第二个收集中没有相应的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));

如何比较两个通用集合

使用Any:

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

您可以在Lambda表达式中使用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});

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

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

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

   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();
        }
    }

输出:10004

一个选项是使用设置操作,即

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