由拉姆达
问题描述:
从另一个排除集合这是我喜欢的类型:由拉姆达
public class myType
{
public int Id { get; set; }
public string name { get; set; }
}
而且还有2集这种类型的:
List<myType> FristList= //fill ;
List<myType> Excludelist= //fill;
,我需要从FristList
类似下面的排除Excludelist
:
List<myType> targetList =
FirstList.Where(m=>m.Id not in (Excludelist.Select(t=>t.Id));
什么是你的建议关于确切的lambda快递上述查询的离子?
答
三个选项。一个没有任何变化:
var excludeIds = new HashSet<int>(excludeList.Select(x => x.Id));
var targetList = firstList.Where(x => !excludeIds.Contains(x.Id)).ToList();
可替换地,无论是覆盖Equals
和GetHashCode
和使用:
var targetList = firstList.Except(excludeList).ToList();
或写入IEqualityComparer<MyType>
它通过的ID进行比较,并使用:
var targetList = firstList.Except(excludeList, comparer).ToList();
第二而第三种选择绝对是更好的IMO,特别是如果你需要在不同的地方做这种工作的话。
+0
我同意后面的选项比较干净,但是如果'excludeList'中有一些不重要的项目,第一个选项会不会更好? – richardtallent 2012-03-17 08:01:20
+0
@richardtallent:不可以,因为'Except'无论如何都会在内部建立一个哈希集合。 – 2012-03-17 08:14:43
可能的重复[如何从另一个有效的C#中减去一个巨大的列表](http://stackoverflow.com/questions/5091922/how-to-subtract-one-huge-list-from-another-efficiently- in-c-sharp) – richardtallent 2012-03-17 07:26:30