我有2個序列,每個序列返回一個帶有2個字段的匿名類型(稱它們爲x和y)。從語義上講,x在這兩個序列中都是鍵和y的值。將2個Linq序列合併成一個,優先級爲
如何指定第一個序列優先於第二個序列,以防兩個序列中出現相同的x,從而將它們合併爲1個序列?
我有2個序列,每個序列返回一個帶有2個字段的匿名類型(稱它們爲x和y)。從語義上講,x在這兩個序列中都是鍵和y的值。將2個Linq序列合併成一個,優先級爲
如何指定第一個序列優先於第二個序列,以防兩個序列中出現相同的x,從而將它們合併爲1個序列?
您可能會發現更容易做沒有LINQ的,但我想是這樣的:
var distinctWithPrecedence = seq1
.Concat(seq2)
.GroupBy(i => i.x)
.Select(g => g.First());
如果LINQ的沒有做太多來在幕後。基本思想是按關鍵分組。然後通過分組拉第一個元素。如果Linq表現出我的想法,那麼第一個元素將成爲連接列表中的第一個元素,這意味着第一個序列具有先例。
可能還有其他方法可以做到這一點,但這是首先想到的。
我將開始與
var res = seq1.Union(seq2, Comparer);
但Enumerable.Union
的文件沒有指定從哪個序列匹配的元素取,並要求Comparer
是的IEqualityComparer<TSource>
的實現,你會不會有,如果TSource
是一個匿名類型(但可能值得具體允許)。
否則,你將需要實現你自己的助手,是這樣的:
(如果你想堅持自己的類型(屬性X & Y),可以讓這個普通的過於單一類型參數,但需要添加類型約束才能訪問單獨的屬性。)
爲了完整起見,我會注意到'Union` *確實指出'first''wins',如果匹配元素存在於`second`:[`Union`按該順序枚舉* first *和* second ** **併產生每個尚未產生的元素。](http://msdn.microsoft .COM/EN-US /庫/ bb341731.aspx) – AakashM 2011-10-25 14:01:09