2017-08-28 5 views
1

C#MoreLinqを使用して重複を解消しようとしています。DistinctBy 3 Params

ここは例です。チーム内にリーグがあります。チーム内の各プレイヤーは任意のポジションでプレーすることができます。これにより

public sealed class Triad 
{ 
    public int Id1 {get;set;} 
    public int Id2 {get;set;} 
    public int Id3 {get;set;} 
} 

私はId1の= 1、Id2と= 2およびID3 = 3は、この例では、我々は1オブジェクトを取得したい場合

ArrayOfTraids.GroupBy(new { Id1, Id2, Id3}).Select(t => t); 

をGROUPBYたいです。

私が解決したい問題は、Id1 = 2、Id3 = 1の場合、int値は1,2,3(関係なく)同じリストから離れていてほしい注文のうち、彼らはまだ同じ値です)。

私はこれが非常に簡単かもしれないと感じますが、わかりません。

は、繰り返しを排除し、この

ArrayOfTriads.Where(t => t.Id1 < t.Id2 && t.Id2 < t.Id3) 

ようなことをやってしまった

を解決しました。閉まっている。

+0

あなたの質問に直接 'players.DistinctByた(p =>新しい{p.Prop1、p.Prop2、p.Proper3に答えるここでは行うことができる方法です。 }) ' – abatishchev

+0

@abatishchevこれは、Playerが常にポジション1にとどまっている場合にのみ機能します。プレイヤーAがポジション2に移動した場合、新しい「チーム」が検討されます。私はそれが欲しくない。私はシンプルだが、それほど単純ではないと感じている。 :) –

+1

あなたの質問は理解しにくいです。入力と出力の例を教えてください。 – Xela

答えて

0

あなたの答え:

ArrayOfTriads.Where(t => t.Id1 < t.Id2 && t.Id2 < t.Id3) 

次の例では動作しません。これは、代わりにそれらのうちの1つを選択する最初の2つの要素をフィルタリング:

ArrayOfTraids.Add(new Triad(3, 2, 1)); 
ArrayOfTraids.Add(new Triad(2, 3, 1)); 
ArrayOfTraids.Add(new Triad(1, 2, 4)); 
ArrayOfTraids.Add(new Triad(1, 2, 5)); 

は、あなたが得る:

Id1 Id2 Id3 
1 2 4 
1 2 5 

は、私はあなたが注文した同上のことでグループ化することだと思います。

ArrayOfTraids 
.GroupBy(m => (string.Join(";", new List<int> { m.Id1, m.Id2, m.Id3 } 
.OrderBy(n => n)))).Select(m => m.First()); 

これが生成します:

Id1 Id2 Id3 
3 2 1 
1 2 4 
1 2 5