C# 在C4.0中求两个多维数组的交集

C# 在C4.0中求两个多维数组的交集,c#,.net-4.0,multidimensional-array,intersection,ranking,C#,.net 4.0,Multidimensional Array,Intersection,Ranking,试图找到解决我排名问题的方法 基本上我有两个多维双[,]数组。两者都包含特定场景的排名,因此[rank number,scenario number]。多个场景可以具有相同的等级 我想生成第三个多维数组,取前两个多维数组的交点,以提供联合排名 有人知道我怎么用C语言来做吗 非常感谢您提供的任何建议或帮助 编辑: 谢谢你的回复,对不起,我应该包括一个例子 这是: Array One: [{0,4},{1,0},{1,2},{2,1},{3,5},{4,3}] Array Two: [{0,1},

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

基本上我有两个多维双[,]数组。两者都包含特定场景的排名,因此[rank number,scenario number]。多个场景可以具有相同的等级

我想生成第三个多维数组,取前两个多维数组的交点,以提供联合排名

有人知道我怎么用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;
    }
在大多数情况下,查找多维数组的交集将涉及迭代数组中每个维度中的元素。如果数组的索引不是匹配条件的一部分,那么我在代码中的第二个假设将被删除,您将不得不遍历每个数组中的每个维度-这将增加算法的运行时间,从^2增加到^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();
查看以下有关可枚举的msdn文章。有关更多信息,请参阅Intersect:

您能否分享一个示例,说明阵列与数据的外观以及组合时希望它们的外观?为什么秩数是一个维度?仅仅有一个数组,其中索引是场景,索引处的值是秩,这难道不够吗?Druegor,补充道-谢谢!唐纳德,如果需要的话,我可以把它转换成那样?谢谢你的回答,谢谢。不幸的是,这并不是我想要的——完全是我的错,对不起!我应该举个例子。我现在添加了一个。