C# 使用 Linq [duplicate] 获取不同的整数子列表

C# Get distinct sub-list of ints using Linq [duplicate]

提问人:Char 提问时间:8/28/2023 最后编辑:Dmitry BychenkoChar 更新时间:8/28/2023 访问量:34

问:

我有一个整数列表列表:为了简单起见,它有价值.如何使用 Linq 获取所有不同的子列表?在这种情况下,这只是.List<List<int>>[[1, 2, 3], [1, 2, 3]][1, 2, 3]

我尝试了与配对,但没有运气。.Distinct().GroupBy(x => x).Select(x => x.First())

谢谢!

C# 列表 LINQ

评论

0赞 Zazaeil 8/28/2023
这是一项家庭任务,还是您正在解决现实世界的问题?如果是后者,您尝试采取的方法值得怀疑。
0赞 Flydog57 8/28/2023
使用 JetBrains 的 DotPeek 查看扩展方法的代码。它可能使用某种方法来比较项目之间的相等性。看看是否有某种方法可以将手写的实现注入到流程中。查看文档(learn.microsoft.com/en-us/dotnet/api/...),看起来你可以。您需要做的就是滚动自己的比较器DistinctIEqualityComparer

答:

0赞 Dmitry Bychenko 8/28/2023 #1

首先,您应该定义何时相等并实现相应的比较器。例如,如果我们假设List<int>

当且仅当列表包含相等的项目、订单和数量很重要时,列表才等于列表:ab{1, 2, 3} == {1, 2, 3} != {2, 1, 3} != {1, 1, 2, 3}

我们可以想出

private sealed class MyComparer<T> : IEqualityComparer<IEnumerable<T>> {
  public bool Equals(IEnumerable<T>? x, IEnumerable<T>? y) =>
     (ReferenceEquals(x, y)) ? true
    : x is null || y is null ? false
    : x.SequenceEqual(y);

  public int GetHashCode(IEnumerable<T> obj) => obj is null ? -1 : obj.Count();
}

那么你就可以了:Distinct

List<List<int>> list = ...

var result = list
  .Distinct(new MyComparer<int>())
  .ToList();