有一个矩阵字典,如何返回一个包含最小数目为零的矩阵的字典?

时间:2018-08-16 10:07:31

标签: c# dictionary

我有一个包含矩阵的字典,我要为每个矩阵计数零的数目,并返回一个包含最小为零的元素的字典 为此,我已经有了一种方法来计算零的数量,以及如何使矩阵的最小值为零,但是我不知道如何返回该对。

enter image description here

Dictionary<string, int[,]> c
        foreach ( int[,] entry in c.Values)
        {
            //array to contain the number of zeros
              int[] max_couverture = new int[c.Count];
                for (int i = 0; i < max_couverture.Length; i++)
                {
             //calcul_zero the method that calculate the number of zero of a matrix
                    max_couverture[i] = calcul_zero(entry);
                }
                int min = max_couverture[0];
                for (int i = 0; i < max_couverture.Length; i++)
                {
                    if (max_couverture[i] < min) min = max_couverture[i];

                    i++;
                }


        }
//calculate the number of zero of a matrix
 public static  int calcul_zero(int[,] m)
    {
        int colIdx = 0; // column index to check
        int num = Enumerable.Range(0, m.GetLength(0)).Count(i => m[i, colIdx] == 0);
        return num;
    }

2 个答案:

答案 0 :(得分:1)

可以通过使用分解问题的解决方案来解决问题。首先,不幸的是,int[,]没有实现IEnumerable<int>,可以通过以下扩展方法来解决。

public static IEnumerable<T> ToEnumerable<T>(this T[,] target)
{
    foreach (var item in target)
    {
        yield return item;
    }
}

接下来,我们可以使用Linq定义一个对二维数组中的零进行计数的函数,如下所示。

public static int CountZeros(int[,] iMat)
{
    return iMat.ToEnumerable<int>().Count(iInt => 0 == iInt);
}

惊奇的是,Linq也没有提供扩展方法来确定序列的元素(如果对其应用了某种功能,该元素是最大还是最小)。这可以通过以下两种扩展方法来完成。

public static T ArgMin<T, R>(T t1, T t2, Func<T, R> f)
where R : IComparable<R>
{
    return f(t1).CompareTo(f(t2)) > 0 ? t2 : t1;if equal
}

public static T ArgMin<T, R>(this IEnumerable<T> Sequence, Func<T, R> f)
where R : IComparable<R>
{
    return Sequence.Aggregate((t1, t2) => ArgMin<T, R>(t1, t2, f));
}

最后,我们可以定义一个返回字典的方法,该字典包含零个数最小的第一个键和值矩阵。

public static Dictionary<string, int[,]> MinNumOfZeros(Dictionary<string, int[,]> iDict)
{
    var KeyOfMinimum = iDict.Keys.ArgMin(iKey => CountZeros(iDict[iKey]));
    return new Dictionary<string, int[,]> { { KeyOfMinimum, iDict[KeyOfMinimum] } };
}

答案 1 :(得分:1)

您可以通过稍微修改calcul_zero来实现。即:

{
// ...
var minKV = c.ToList()
    .OrderBy(k => calcul_zero(k.Value))
    .First();

Console.WriteLine(minKV.Key);
//...
}
public static int calcul_zero(int[,] m)
{
    int zeros=0;
    for (int i = 0; i < m.GetLength(0); i++)
    {
        for (int j = 0; j < m.GetLength(1); j++)
        {
            if (m[i, j] == 0) zeros++;
        }
    }
    return zeros;
}