1

我正在尝试使用 C# MoreLinq 来尝试找出重复项。

这是一个例子。有联盟,联盟内有球队。球队中的每个球员都可以踢任何位置。

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) 

这消除了重复。关闭。

4

1 回答 1

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

我认为您可能希望按订购的 ID 进行分组。这是一种可以做到的方法:

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
于 2017-11-10T06:10:20.517 回答