我正在尝试使用C# MoreLinq来尝试找出重复项。
下面是一个示例。有一个联赛,在联赛中球队。 团队中的每个球员都可以打任何位置。
public sealed class Triad
{
public int Id1 {get;set;}
public int Id2 {get;set;}
public int Id3 {get;set;}
}
有了这个,我想按
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)
这消除了重复。 闭。
你的答案:
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