2012-04-02 30 views
1

以爲我的搜索範圍很容易找到。如何組合兩個列表而不重複? (可能爲dup)

我希望將兩個列表合併在一起,而不是重複。這是我的黑客企圖。

public class MyClass 
{ 
    public Guid? MyGuid { get; set; } 
} 

//..... 

Guid? dupGuid1 = Guid.NewGuid(); 
Guid? uniqueGuid1 = Guid.NewGuid(); 

MyClass x1 = new MyClass { MyGuid = dupGuid1 }; 
List<MyClass> myMainList = new List<MyClass>() { x1 }; 


MyClass y1 = new MyClass { MyGuid = dupGuid1 }; 
MyClass y2 = new MyClass { MyGuid = uniqueGuid1 }; 
List<MyClass> myAddList = new List<MyClass> { y1, y2 }; 

myMainList.AddRange(myAddList 
    .Where(w => w.MyGuid != myAddList.SelectMany(s => s.MyGuid).ToList())); 

Debug.Assert(myMainList.Count == 2); 

我該怎麼做?謝謝。

+0

爲什麼你在比較Guid嗎?到列表,這不應該編譯。 – 2012-04-02 00:52:17

+0

不值得回答,但考慮創建一個實現「IEqualityComparer」並採用一些謂詞的通用'CustomComparer'類,然後在比較其他自定義類型時可以隨處使用該類。 – 2012-04-02 00:54:58

回答

9
var uniqueList = myMainList 
    .Concat(myAddList) 
    .GroupBy(item => item.MyGuid) 
    .Select(group => group.First()) 
    .ToArray(); 

var uniqueList = myMainList 
     .Concat(myAddList) 
     .DistinctBy(item => item.MyGuid) 
     .ToArray(); 

    public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> items, 
        Func<T, TKey> keyer) 
    { 
    var set = new HashSet<TKey>(); 
    var list = new List<T>(); 
    foreach (var item in items) 
    { 
     var key = keyer(item); 
     if (set.Contains(key)) 
     continue; 
     list.Add(item); 
     set.Add(key); 
    } 
    return list; 
    } 
4

使用Union()應該這樣做。

來自Why doesn't the Union function in LINQ remove duplicate entries?

var list1 = new[] { "a", "s", "d" }; 
var list2 = new[] { "d", "a", "f", "123" }; 
var union = list1.Union(list2); 
union.Dump(); // this is a LinqPad method 

編輯

您還需要重寫你的類GetHashCode()Equals(object obj)(應該始終被反正做)

public class MyClass 
    { 
     public int ID { get; set; } 

     public override bool Equals(object obj) 
     { 
      return this.ID == ((MyClass)obj).ID; 
     } 

     public override int GetHashCode() 
     { 
      return ID.GetHashCode(); 
     } 
    } 

var lst1 = new List<MyClass> { new MyClass { ID = 1 }, new MyClass { ID = 2 }, new MyClass { ID = 3 } }; 
var lst2 = new List<MyClass> { new MyClass { ID = 3 }, new MyClass { ID = 4 }, new MyClass { ID = 5 } }; 

var newList = lst1.Union(lst2); 

foreach (var myClass in newList) 
    { 
     Console.WriteLine("ID: {0}", myClass.ID); 
     } 
+0

-1 ..我想你沒有注意到他正在使用自定義類「MyClass」,這意味着他必須爲大多數LINQ方法實現「IEqualityComparer」。 – 2012-04-02 00:52:17

+0

你說得對,對不起。請參閱編輯。 – TheRealTy 2012-04-02 01:08:59

相關問題