我MEDECINE對象的兩個列表:比較兩個列表<T>使用LINQ
List<Medecine> list1;
List<Medecine> list2;
MedecineID
,MedecineName
等都是Medecine
性能; `MedecineID是獨一無二的。
我想要一個列表中的對象在list1
但不在list2
;
我MEDECINE對象的兩個列表:比較兩個列表<T>使用LINQ
List<Medecine> list1;
List<Medecine> list2;
MedecineID
,MedecineName
等都是Medecine
性能; `MedecineID是獨一無二的。
我想要一個列表中的對象在list1
但不在list2
;
var query = list1.Except(list2);
var list1NotList2 = query.ToList();
這會給你一切都在list1
但不list2
的項目。
請注意,您需要確保您的Medecine
對象可以正確比較(通常通過Equals
/GetHashCode
)。您還可以傳遞一個自定義IEqualityComparer
作爲Except
的最後一個參數。
有關Except
的更多信息,請參閱here。
如果你想避免編寫自定義的比較對象爲你的藥類,那麼你可以只投影「MedecineId」出第二個列表進入一個新的集合,然後使用IEnumerable.Contains()創建您的「期望」的文章:
class Medecine
{
public Guid MedecineId { get; set; }
public String Name { get; set; }
// whatever other fields
}
創建一些測試數據:
List<Guid> mIds =
new List<Guid>(Enumerable.Range(0, 20).Select(n => Guid.NewGuid()));
List<Medecine> m1 = new List<Medecine>
(
Enumerable.Range(0, 10).Select(c => new Medecine() { MedecineId = mIds.ElementAt(c), Name = c.ToString() })
);
List<Medecine> m2 = new List<Medecine>
(
Enumerable.Range(5, 15).Select(d => new Medecine() { MedecineId = mIds.ElementAt(d), Name = d.ToString() })
);
然後讓你的結果很簡單:
var excludedIds = m2.Select(m2s => m2s.MedecineId).Distinct();
var results = m1.Where(m1s => !excludedIds.Contains(m1s.MedecineId));
自然的方式在LINQ做,這是通過使用Enumerable.Except
方法:
var results = list1.Except(list2).ToList();
然而,對於這個工作,你必須告訴LINQ當兩個對象是「相同的」。
class Medecine : IEquatable<Medecine>
{
public int MedecineID { get; set; }
public string MedecineName { get; set; }
public override int GetHashCode() {
return this.MedecineID;
}
public bool Equals(Medecine other)
{
if (ReferenceEquals(null, other)) {
return false;
}
if (ReferenceEquals(this, other)) {
return true;
}
return other.MedecineID == this.MedecineID;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) {
return false;
}
if (ReferenceEquals(this, obj)) {
return true;
}
if (obj.GetType() != typeof(Medecine)) {
return false;
}
return Equals((Medecine)obj);
}
}
如果這種方式不適合,你可以使一個IEqualityComparer<Medecine>
並傳遞到Except
作爲附加參數:
class MyComparer : IEqualityComparer<Medecine>
{
public bool Equals(Medecine x, Medecine y)
{
if (x == null && y == null) {
return true;
}
if (x == null || y == null) {
return false;
}
return x.MedecineID == y.MedecineID;
}
public int GetHashCode(Medecine obj)
{
return obj.MedecineID;
}
}
var results = list1.Except(list2, new MyComparer()).ToList();
可以通過讓
Medecine
實現
IEquatable<Medecine>
這樣做