如何删除列表中的重复对

joh*_*nri 6 c# list duplicates

我得到了一对带有整数的List.如果它们是重复的,我该如何删除它们?区别不会工作导致该对可能是(2,1)而不是(1,2).

我的列表看起来像这样:

1, 2
2, 3
3, 1
3, 2
2, 4
4, 3
Run Code Online (Sandbox Code Playgroud)

......我不需要(2,3)和(3,2)

我做了一个public struct FaceLinepublic int AB,然后var faceline = new List<FaceLine>();.

我是C#的新手而且输了.

Tim*_*ter 14

您可以使用自定义IEqualityComparer<FaceLine>:

public class UnorderedFacelineComparer : IEqualityComparer<FaceLine>
{
    public bool Equals(FaceLine x, FaceLine y)
    {
        int x1 = Math.Min(x.A, x.B);
        int x2 = Math.Max(x.A, x.B);
        int y1 = Math.Min(y.A, y.B);
        int y2 = Math.Max(y.A, y.B);
        return x1 == y1 && x2 == y2;
    }

    public int GetHashCode(FaceLine obj)
    {
        return obj.A ^ obj.B;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后查询非常简单:

var comparer = new UnorderedFacelineComparer();
List<FaceLine> nonDupList = faceLine
    .GroupBy(fl => fl, comparer)
    .Where(g => g.Count() == 1)
    .Select(g => g.First())
    .ToList();
Run Code Online (Sandbox Code Playgroud)

如果你想保留其中一个重复项,你只需要删除Where:

List<FaceLine> nonDupList = faceLine
    .GroupBy(fl => fl, comparer)
    .Select(g => g.First())
    .ToList();
Run Code Online (Sandbox Code Playgroud)

  • @styx:如果结果应该再次成为`List <FaceLine>`,则删除所有重复项.在`.Where(g => g.Count()== 1).ToList()之后,我们得到一个`List <System.Linq.IGrouping <FaceLine,FaceLine >>`.查询不知道这些组只包含一个,我们只想要那个,因此我们需要`First`. (2认同)