试图找到一个解决我的排名问题的方法。
基本上我有两个多维双精度数组[,]。两者都包含特定场景的排名,所以[rank number, scenario number]。多个场景可以有相同的rank。
我想生成第三个多维数组,取前两个多维数组的交点来提供一个联合排名。
有没有人知道我如何在c#中做到这一点?
非常感谢您提供的任何建议或帮助!
编辑:感谢您的所有回复,抱歉我应该附上一个例子。
在这里:
Array One:
[{0,4},{1,0},{1,2},{2,1},{3,5},{4,3}]
Array Two:
[{0,1},{0,4},{1,0},{1,2},{3,5},{4,3}]
Required Result:
[{0,4},{1,0},{1,2},{1,1},{2,5},{3,3}]
这里有一些示例代码,它做了一些假设,但可能是您正在寻找的东西。我还添加了一些注释:
static double[,] Intersect(double[,] a1, double[,] a2)
{
// Assumptions:
// a1 and a2 are two-dimensional arrays of the same size
// An element in the array matches if and only if its value is found in the same location in both arrays
// result will contain not-a-number (NaN) for non-matches
double[,] result = new double[a1.GetLength(0), a1.GetLength(1)];
for (int i = 0; i < a1.GetLength(0); i++)
{
for (int j = 0; j < a1.GetLength(1); j++)
{
if (a1[i, j] == a2[i, j])
{
result[i, j] = a1[i, j];
}
else
{
result[i, j] = double.NaN;
}
}
}
return result;
}
在大多数情况下,查找多维数组的交集将涉及遍历数组中每个维度的元素。如果数组的下标不是匹配标准的一部分(我在代码中的第二个假设被删除了),您将不得不遍历每个数组中的每个维度——这会增加算法的运行时间(在本例中,从O(n^2)到O(n^4))。
如果你足够关心运行时,我相信数组匹配是动态规划(DP)优化的典型例子之一;你可以在你空闲的时候阅读。
我不知道你想要什么样的结果…您可能会返回可由一对索引的结果的平面集合,如果预期的结果集通常很小,这可能会节省大量空间。我选择了第三个固定大小的数组,因为这是最简单的事情。
最后,我要提到的是,我没有看到使用IEnumerable、LINQ或类似的东西来实现这一点的c#方式。有比我更懂c#的人可以随时插话....
考虑到这些附加信息,我认为您实际上并不是在处理多维数组,而是在处理一对的集合。这对是一双双打。我认为下面的代码应该可以很好地工作:
public class Pair : IEquatable<Pair>
{
public double Rank;
public double Scenario;
public bool Equals(Pair p)
{
return Rank == p.Rank && Scenario == p.Scenario;
}
public override int GetHashCode()
{
int hashRank= Rank.GetHashCode();
int hashScenario = Scenario.GetHashCode();
return hashRank ^ hashScenario;
}
}
你可以在IEnumerable上使用Intersect运算符:
List<Pair> one = new List<Pair>();
List<Pair> two = new List<Pair>();
// ... populate the lists
List<Pair> result = one.Intersect(two).ToList();
查看以下关于Enumerable.Intersect()的msdn文章以获取更多信息:http://msdn.microsoft.com/en-us/library/bb910215%28v=vs.90%29.aspx