2009-06-17 12 views
1

2つのシーケンスを持ち、それぞれが2つのフィールド(xとyと呼ぶ)を持つ匿名型を返します。意味的には、xはキーとして、yはこれらのシーケンスの両方の値として機能します。2つのLinqシーケンスを1つに優先順位をつけてマージする

同じxが両方に表示される場合、最初のシーケンスが2番目のシーケンスよりも優先されるように指定すると、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のドキュメントは、一致する要素が取られたシーケンスから指定し、TSource場合はありませんIEqualityComparer<TSource>の実装であることをComparerを必要としません。匿名型です(ただし、これを可能にするためには具体的な価値があるかもしれません)。

そうでない場合は、あなたが、あなたのような何か独自のヘルパーを実装する必要があります:

を(あなたはX & yの独自のタイプ(プロパティ)に固執する場合は、単一種類以上、これは一般的なことができますパラメータではなく、別のプロパティにアクセスするために型制約を追加する必要があります)。

+0

「Union」*は* 'second':[' Union'は、* first *と* second * **をこの順に列挙し、まだ生成されていない各要素を生成します。](http://msdn.microsoft .com/ja-us/library/bb341731.aspx) – AakashM

関連する問題