C# IEnumerable<;IEnumerable<;int>>;-没有重复的IEnumerable<;int>;s

C# IEnumerable<;IEnumerable<;int>>;-没有重复的IEnumerable<;int>;s,c#,linq,ienumerable,C#,Linq,Ienumerable,我正试图找到解决这个问题的方法: 给定一个IEnumerable我需要一个返回输入的方法/算法,但如果有多个IEnumerable具有相同元素,则每个重合点/组只返回一个 前 IEnumerable seqs=new[] { 新[]{2,3,4},//#0 新[]{1,2,4},//#1-等于#3 新[]{3,1,4},//#2 新[]{4,1,2}/#3-等于#1 }; “每个序列中的每个序列”。。产生{0,{1,{2}或{0,{2,{3} 我应该和……一起去吗 。。一些聪明的高质量的公司

我正试图找到解决这个问题的方法:

给定一个IEnumerable>我需要一个返回输入的方法/算法,但如果有多个IEnumerable具有相同元素,则每个重合点/组只返回一个

IEnumerable seqs=new[]
{ 
新[]{2,3,4},//#0
新[]{1,2,4},//#1-等于#3
新[]{3,1,4},//#2
新[]{4,1,2}/#3-等于#1
};
“每个序列中的每个序列”。。产生{0,{1,{2}或{0,{2,{3}

我应该和……一起去吗

。。一些聪明的高质量的公司

。。我还没有想出一些聪明的LINQ组合-groupby,sequenceequal

。。一些seq->HashSet的东西

。。没什么。什么都行


我可以通过好的“n”旧编程来解决这个问题,但灵感总是很受欢迎的。

为工作使用正确的收集类型。您真正想要的是
ISet
,它带有一个相等比较器,可以忽略
IEnumerable
s的顺序。

编辑:

var values = seqs.Distinct(new MyEqualityComparer()).ToList();
您可以通过构建自己的
IEqualityComparer
来获得您想要的,例如:

public class MyEqualityComparer : IEqualityComparer<IEnumerable<int>>
{
    public bool Equals(IEnumerable<int> x, IEnumerable<int> y)
    {
        return x.OrderBy(el1 => el1).SequenceEqual(y.OrderBy(el2 => el2));
    }

    public int GetHashCode(IEnumerable<int> elements)
    {
        int hash = 0;
        foreach (var el in elements)
        {
            hash = hash ^ el.GetHashCode();
        }
        return hash;
    }
}

N.B.

此解决方案与Jon Skeet给出的解决方案略有不同。
他的回答认为子列表是集合,因此基本上像
[1,2]
[1,1,1,2,2]
这样的两个列表是相等的

此解决方案不需要,即:

[1,2,1,1]
等于
[2,1,1]
,但不等于
[2,2,1,1]
,因此这两个列表基本上必须包含相同的元素和相同的出现次数。

这里是DigeMail答案的一个稍微简单的版本:

var result = seqs.Select(x => new HashSet<int>(x))
                 .Distinct(HashSet<int>.CreateSetComparer());
var result=seqs.Select(x=>newhashset(x))
.Distinct(HashSet.CreateSetComparer());
鉴于您希望将元素视为集合,您应该以这种方式开始,IMO

当然,如果您想在返回的序列中保持顺序,这是没有帮助的,您只是不介意返回哪个相等的集合。。。上述代码将返回一个
IEnumerable
,在每个序列中不再有任何顺序。(返回集合的顺序也不能保证,尽管它们不以先见先返回的方式返回会很奇怪。)

这似乎还不够,但如果你能提供更多你真正需要实现的细节,这将使你更容易得到帮助


如注释中所述,这还将假设每个原始源数组中没有重复项。。。或者至少,它们是不相关的,所以你很乐意将{1}和{1,1,1,1}视为相等。

+1:从未听说过
HashSet.CreateSetComparer
。但这并不完全正确;我认为最后一位应该是
我认为
Where
子句不应该在那里。@Ani:是的,你是对的,实际上我看错了OP问题(我不知道为什么,但我认为他想排除多次出现的子列表…O_O)。“如此独特”远比groupby select first更可取……鉴于我之前的解决方案部分错误,并且基本上与Jon Skeet相同,我改变了方法;)谢谢digEmAll。我的iQualityComparer有了新的进展:)+1很好,但是您应该警告OP a)不同频率的重复导致问题b)这会破坏每个数组中数字的顺序c)这并不是真正返回原始源序列的成员。@Ani:我已经提到过破坏数组中数字的顺序,但我现在已经说得更清楚了。将在每个数组中添加一些关于重复项的内容。@Ani:不用担心-这是一个关于数组中重复项的好机会:)这不是一个使用ArrayQualityComparer的好机会吗?还是类似的?:)@阿尼:在这种情况下不是这样的,因为这取决于顺序。
var result = seqs.Select(x => new HashSet<int>(x))
                 .Distinct(HashSet<int>.CreateSetComparer());