我有两个名为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));
答案 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);