Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获得不同的列表类型列表_C#_Linq - Fatal编程技术网

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

C# 如何获得不同的列表类型列表,c#,linq,C#,Linq,这是我的代码(如果愿意,可以复制并粘贴到linqpad中) 我得到的结果是{7,8},{7,8},{7,8,9} 我想要的是{7,8},{7,8,9} 基本上我想删除重复的列表。 我还没有尝试过这个方法,但我认为我可以通过创建一个比较器并将其传递到Distinct方法中来实现。但是,我希望最终在LINQtoEntities查询中使用它,而不将数千行带回客户端,因此这不是一个好的选择 为了进一步澄清…我需要返回一个列表>,其中每个内部列表的内容与任何其他内部列表的内容相比都是不同的。问题是.dis

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

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

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

基本上我想删除重复的列表。 我还没有尝试过这个方法,但我认为我可以通过创建一个比较器并将其传递到Distinct方法中来实现。但是,我希望最终在LINQtoEntities查询中使用它,而不将数千行带回客户端,因此这不是一个好的选择


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

问题是
.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访问实体或类似的东西,这将不会很好地工作

更新 要使其成为一个
列表
,您需要在其中抛出一些
.ToList()
s:

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

但坦率地说,我不知道这对你有什么关系。

这里有一个替代答案:

messageUsers
    .GroupBy (x => x.MsgId, y=>y.UserId)
    .Select (x => new HashSet<int>(x))
    .Distinct(HashSet<int>.CreateSetComparer())
    .Dump();
你想要什么结果


{7,8}、{7,8,9}或{7,8}、{8,7}、{7,8,9}。

匿名类型正确覆盖
GetHashCode
Equals
。。。(请参阅)@TwistedInferno,它不需要这样做,因为
i分组
实现了
IEnumerable
,因此在
Join
中可以很好地工作@KirkWoll:是的,但IEnumerables通常不会。他试图得到不同的价值列表,而不是不同的价值组合。@striplingwarrior,啊,是的,非常正确。“我没注意到这点。”@TwistedInferno:我想人们拒绝了你的编辑,因为它从本质上改变了答案的性质。不过,欢迎您使用这些附加信息创建自己的答案。+1。我不知道HashSet.CreateSetComparer()的事。很好。另外,我很高兴你提出了顺序是否比所有相同值的存在更重要的问题。
messageUsers
    .GroupBy (x => x.MsgId, y=>y.UserId)
    .Select (x => new HashSet<int>(x))
    .Distinct(HashSet<int>.CreateSetComparer())
    .Dump();
var messageUsers = new [] { 
    new { MsgId = 2, UserId = 7 },
    new { MsgId = 2, UserId = 8 },
    new { MsgId = 3, UserId = 8 },
    new { MsgId = 3, UserId = 7 },
    new { MsgId = 1, UserId = 7 },
    new { MsgId = 1, UserId = 8 },
    new { MsgId = 1, UserId = 9 }};