2017-08-28 38 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;} 
} 

有了這個,我想GROUPBY

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

如果ID1 = 1,Id2的= 2和ID3 = 3,在這個例子中,我們會得到1個對象。

我想解決的問題是,如果Id1 = 2,Id2 = 3,Id3 = 1,我希望它也是相同的列表的分開,因爲int值仍然是1,2,3(不管的順序,它們仍然是相同的值)。

我覺得這可能很簡單,但我不確定。

解決

結束了做這樣的事情

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

這樣可以避免重複。關閉。

+0

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

這將產生})' – abatishchev

+0

@abatishchev只有玩家始終保持位置1纔有效。如果玩家A移動到位置2,則考慮一個新的「團隊」。我不想要它。我覺得它很簡單,但並不那麼簡單。 :) –

+1

你的問題很難理解。給我一個輸入和輸出的例子。 – Xela

回答

0

你的回答:

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

不與下面的例子中工作。它過濾掉前兩個元素,而不是選擇其中的一種:

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 

我認爲你可能想通過有序標識的組。這是一個方式,它可以做:在回答你的問題直接`players.DistinctBy(P =>新{p.Prop1,p.Prop2,p.Proper3

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