.NET C#-数组中不同数组的数目

.NET C#-数组中不同数组的数目,c#,2d,distinct,permutation,multidimensional-array,C#,2d,Distinct,Permutation,Multidimensional Array,我是新来的,对C#有点缺乏经验。我一直在搜索MSDN文档和Google,但找不到这个问题的答案(我尝试尽可能笼统地描述它): 我想在一个列表或数组中存储一个固定长度的有序整数序列,然后将这些整数数组组成一个数组。有谁知道我如何计算不同整数数组的数量,以及我应该使用什么特定的数据类型(列表、普通数组等)?我没有我一直在使用的确切代码,但这里有一些类似于我一直在尝试的东西: int[] set1 = {2, 56, 8}; int[] set2 = {8, 25, 90}; int[] set3 =

我是新来的,对C#有点缺乏经验。我一直在搜索MSDN文档和Google,但找不到这个问题的答案(我尝试尽可能笼统地描述它):

我想在一个列表或数组中存储一个固定长度的有序整数序列,然后将这些整数数组组成一个数组。有谁知道我如何计算不同整数数组的数量,以及我应该使用什么特定的数据类型(列表、普通数组等)?我没有我一直在使用的确切代码,但这里有一些类似于我一直在尝试的东西:

int[] set1 = {2, 56, 8};
int[] set2 = {8, 25, 90};
int[] set3 = {2, 56, 8};

var superset = new List<int[]>;
superset.Add(set1);
superset.Add(set2);
superset.Add(set3);

Console.Out.WriteLine(superset.Distinct().Count());  //  would like this to output 2, but Distinct() doesn't seem to actually work and I would get 3
int[]set1={2,56,8};
int[]set2={8,25,90};
int[]set3={2,56,8};
var superset=新列表;
superset.Add(set1);
superset.Add(set2);
superset.Add(set3);
Console.Out.WriteLine(superset.Distinct().Count());//我希望输出2,但Distinct()实际上似乎不起作用,我会得到3

Distinct方法有一个重载,该重载以。为int数组(ie
公共类IntArrayComparer:IEqualityComparer
)创建IEqualityComparer的实现,并将实例传递到对Distinct的调用中


该方法可能对实现
IEqualityComparer.Equals
有所帮助,但这项工作留给您来做

记住一句名言:

“聪明的数据结构和愚蠢的代码比另一种方式好得多。”
-埃里克·雷蒙德,《大教堂与集市》

听起来这里的目标似乎是能够使用简单而富有表现力的代码(
.Distinct()
)来比较数据。在这种情况下,我建议从简单数组升级到更丰富的对象。大概是这样的:

class Numbers
{
  public int FirstNumber { get; set; }
  public int SecondNumber { get; set; }
  public int ThirdNumber { get; set; }
}
然后您可以拥有这些对象的数组,而不是数组数组。这里的好处是,您可以赋予此对象更丰富的功能。例如:

class Numbers : IEquatable<Numbers>
{
  public int FirstNumber { get; set; }
  public int SecondNumber { get; set; }
  public int ThirdNumber { get; set; }

  public bool Equals(Numbers other)
  {
    if (other == null)
      return false;
    return (
      this.FirstNumber == other.FirstNumber &&
      this.SecondNumber == other.SecondNumber &&
      this.ThirdNumber == other.ThirdNumber
    );
  }
}
类别编号:I可计算
{
public int FirstNumber{get;set;}
public int SecondNumber{get;set;}
公共整数第三个数字{get;set;}
公共布尔等于(其他数字)
{
如果(其他==null)
返回false;
返回(
this.FirstNumber==other.FirstNumber&&
this.SecondNumber==其他.SecondNumber&&
this.ThirdNumber==其他.ThirdNumber
);
}
}
现在,更愚蠢的代码可以更有效地使用更智能的数据类型。(仅引用引用,不要认为这是在说您正在编写愚蠢的代码或任何没有帮助的东西。)这通常是首选的,因为这意味着如果需要在多个位置使用比较逻辑,您不必在多个位置重新编写比较逻辑。比较逻辑发生在数据类型内部,而不是过程代码中



请注意,这是未经测试的手绘代码。如果我在实现中遗漏了什么,请更正:)

您只需要为integer数组创建一个比较器类,并将其实例传递给Distinct方法

Console.Out.WriteLine(superset.Distinct(新的ArrayComparer()).Count());
下面是一个例子:

class ArrayComparer:IEqualityComparer
{
公共布尔等于(int[]x,int[]y)
{
//检查比较对象是否引用相同的数据。
if(Object.ReferenceEquals(x,y))返回true;
//检查是否有任何比较对象为空。
if(Object.ReferenceEquals(x,null)| | Object.ReferenceEquals(y,null))
返回false;
如果(x.长度!=y.长度)
返回false;
//检查数组的值是否相等。
对于(int i=0;i

这对我很有用。给出您想要的结果。

尚未发布的答案中没有一个解释了为什么
Distinct()。Count()
返回3:原因是
Distinct()
正在使用默认的数组相等比较器,该比较器比较引用相等。此代码将返回2:

int[] set1 = {2, 56, 8}; 
int[] set2 = {8, 25, 90}; 
int[] set3 = set1;

var superset = new List<int[]>(); 
superset.Add(set1); 
superset.Add(set2); 
superset.Add(set3); 

Console.WriteLine(superset.Distinct().Count()); 
int[]set1={2,56,8};
int[]set2={8,25,90};
int[]set3=set1;
var superset=新列表();
superset.Add(set1);
superset.Add(set2);
superset.Add(set3);
Console.WriteLine(superset.Distinct().Count());
正如Bob和Richard所建议的,您可以通过创建一个实现
IEqualityComparer
来克服这一问题,该实现将为您提供所需的行为。

private int CountDistinct2DPoints(双[][]数据)
 private int CountDistinct2DPoints(double[][] data)
    {
        Dictionary<Tuple<double, double>, int> pointsMap = new Dictionary<Tuple<double, double>, int>();
        for(int i = 0; i < data.Length; i++)
        {
            if (!pointsMap.ContainsKey(Tuple.Create(data[i][0], data[i][1])))
            {
                pointsMap.Add(Tuple.Create(data[i][0], data[i][1]), 1);
            }
            else
            {
                pointsMap[Tuple.Create(data[i][0], data[i][1])]++;
            }
        }
        return pointsMap.Keys.Count;
    }
{ 字典点map=新字典(); for(int i=0;i
您绝对需要使用整数数组吗?如果将固定长度数组设置为自定义对象,则只需在该自定义类上实现
IEquatable(T)
,并且
.Distinct()
将对其进行本机比较。+1用于按照相同的思路思考。这可能