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