在c# 4.0中找到两个多维数组的交集

本文关键字:两个 数组 | 更新日期: 2023-09-27 18:10:41

试图找到一个解决我的排名问题的方法。

基本上我有两个多维双精度数组[,]。两者都包含特定场景的排名,所以[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}]

在c# 4.0中找到两个多维数组的交集

这里有一些示例代码,它做了一些假设,但可能是您正在寻找的东西。我还添加了一些注释:

    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