这是我的代码(如果你喜欢,可以复制并粘贴到 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/