2009-06-17 76 views
1

我有2個序列,每個序列返回一個帶有2個字段的匿名類型(稱它們爲x和y)。從語義上講,x在這兩個序列中都是鍵和y的值。將2個Linq序列合併成一個,優先級爲

如何指定第一個序列優先於第二個序列,以防兩個序列中出現相同的x,從而將它們合併爲1個序列?

回答

1

您可能會發現更容易做沒有LINQ的,但我想是這樣的:

var distinctWithPrecedence = seq1 
    .Concat(seq2) 
    .GroupBy(i => i.x) 
    .Select(g => g.First()); 

如果LINQ的沒有做太多來在幕後。基本思想是按關鍵分組。然後通過分組拉第一個元素。如果Linq表現出我的想法,那麼第一個元素將成爲連接列表中的第一個元素,這意味着第一個序列具有先例。

可能還有其他方法可以做到這一點,但這是首先想到的。

1

我將開始與

var res = seq1.Union(seq2, Comparer); 

Enumerable.Union的文件沒有指定從哪個序列匹配的元素取,並要求Comparer是的IEqualityComparer<TSource>的實現,你會不會有,如果TSource是一個匿名類型(但可能值得具體允許)。

否則,你將需要實現你自己的助手,是這樣的:

(如果你想堅持自己的類型(屬性X & Y),可以讓這個普通的過於單一類型參數,但需要添加類型約束才能訪問單獨的屬性。)

+0

爲了完整起見,我會注意到'Union` *確實指出'first''wins',如果匹配元素存在於`second`:[`Union`按該順序枚舉* first *和* second ** **併產生每個尚未產生的元素。](http://msdn.microsoft .COM/EN-US /庫/ bb341731.aspx) – AakashM 2011-10-25 14:01:09