.NET C#-数组中不同数组的数目
我是新来的,对C#有点缺乏经验。我一直在搜索MSDN文档和Google,但找不到这个问题的答案(我尝试尽可能笼统地描述它): 我想在一个列表或数组中存储一个固定长度的有序整数序列,然后将这些整数数组组成一个数组。有谁知道我如何计算不同整数数组的数量,以及我应该使用什么特定的数据类型(列表、普通数组等)?我没有我一直在使用的确切代码,但这里有一些类似于我一直在尝试的东西:.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 =
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用于按照相同的思路思考。这可能