c# - 如何获得不同的列表类型列表

标签 c# linq

这是我的代码(如果你喜欢,可以复制并粘贴到 linqpad 中)

var messageUsers = new [] { 
    new { MsgId = 2, UserId = 7 },
    new { MsgId = 2, UserId = 8 },
    new { MsgId = 3, UserId = 7 },
    new { MsgId = 3, UserId = 8 },
    new { MsgId = 1, UserId = 7 },
    new { MsgId = 1, UserId = 8 },
    new { MsgId = 1, UserId = 9 }};

messageUsers
    .GroupBy (x => x.MsgId, x => x.UserId)
    .Select (x => x.Select (y => y))
    .Distinct()
    .Dump();

我得到的结果是{7,8}, {7,8}, {7,8,9}

我要的是{7,8}, {7,8,9}。

基本上我想删除重复的列表。 我没有尝试过这个,但我想我可以通过创建一个比较器并将其传递给 Distinct 方法来实现。但是我想最终在 Linq to Entities 查询中使用它,而不会将数千行返回给客户端,所以这不是一个好的选择。

为了进一步说明...我需要返回一个列表>,其中每个内部列表的内容与其他任何内部列表相比都是不同的。

最佳答案

问题是 .Distinct()根据 GetHashCode() 确定不同的内容和 Equals()底层对象的实现。在这种情况下,底层对象是实现 IEnumerable<> 的对象。 , 但它使用默认的 object这些方法的实现——这完全基于对象是否在内存中占用相同的空间。因此,据它所知,这些序列并不明显,即使它们具有相同的值。

这个怎么样?

messageUsers
    .GroupBy (x => x.MsgId, x => x.UserId)
    .GroupBy(x => string.Join(",", x))
    .Select(x => x.FirstOrDefault())
    .Dump();

这个想法是按代表列表中元素组合值的键进行分组。您还可以传递自定义 IEqualityComparer<>Distinct原始代码中的方法,但对于如此微不足道的事情来说,这似乎是一个相当大的努力。

值得注意的是,如果您使用 LINQ to Entities 或类似工具,这将不会很好地工作。

更新

使其成为 List<List<int>> , 你需要一些 .ToList()被扔在那里:

messageUsers
    .GroupBy (x => x.MsgId, x => x.UserId)
    .GroupBy(x => string.Join(",", x))
    .Select(x => x.FirstOrDefault().ToList())
    .ToList()
    .Dump();

但坦率地说,我不确定为什么这对您很重要。

关于c# - 如何获得不同的列表类型列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21591180/

相关文章:

c# - 使用 LINQ 检查特定变量的类列表

c# - CQRS 应用程序中的缓存失效

c# - 单元测试 DateTime 字符串

c# - 动态 LINQ,Select 函数,适用于 Enumerable,但不适用于 Queryable

c# - 为什么 MessageBox 类在 C# 中没有默认构造函数?

c# - 简单的 C# 输出

asp.net-mvc - 获取在 Identity 2 中分配角色的用户列表

c# - LINQ 列中的方法调用

c# - SQL to LINQ in C#(查询多个表和别名)

c# - 我应该在 SQL 中还是在 LINQ 中执行 Where 子句?