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

C# 有了矩阵字典,如何返回一个包含最小零数矩阵的字典?,c#,dictionary,C#,Dictionary,我有一个包含矩阵的字典,我想为每个矩阵计算零的数目,并返回一个包含最小值为零的元素的字典 为了做到这一点,我已经有了计算零个数的方法,以及如何得到最小值为零的矩阵,但我不知道如何返回该对 字典c foreach(c.Values中的int[,]条目) { //数组以包含零的数目 int[]max_couverture=新的int[c.Count]; 对于(int i=0;i0?t2:t1;如果相等 } 公共静态T ArgMin(此IEnumerable序列,Func f) 其中R:i可比较 {

我有一个包含矩阵的字典,我想为每个矩阵计算零的数目,并返回一个包含最小值为零的元素的字典 为了做到这一点,我已经有了计算零个数的方法,以及如何得到最小值为零的矩阵,但我不知道如何返回该对

字典c foreach(c.Values中的int[,]条目) { //数组以包含零的数目 int[]max_couverture=新的int[c.Count]; 对于(int i=0;im[i,colIdx]==0); 返回num; }
通过分解问题,使用已有的设施可以解决问题。首先,不幸的是,
int[,]
没有实现
IEnumerable
,可以使用以下扩展方法对其进行寻址

public static IEnumerable<T> ToEnumerable<T>(this T[,] target)
{
    foreach (var item in target)
    {
        yield return item;
    }
}
公共静态IEnumerable到numerable(此T[,]目标)
{
foreach(目标中的var项目)
{
收益回报项目;
}
}
接下来,我们可以使用Linq定义一个函数,该函数计算二维数组中的零数,如下所示

public static int CountZeros(int[,] iMat)
{
    return iMat.ToEnumerable<int>().Count(iInt => 0 == iInt);
}
公共静态int countzero(int[,]iMat)
{
返回iMat.ToEnumerable().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));
}
publicstatict ArgMin(t1,t2,Func f)
其中R:i可比较
{
返回f(t1)。比较(f(t2))>0?t2:t1;如果相等
}
公共静态T ArgMin(此IEnumerable序列,Func f)
其中R:i可比较
{
返回序列.聚合((t1,t2)=>ArgMin(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] } };
}
公共静态字典minnumofzero(字典iDict)
{
var keyofminium=iDict.Keys.ArgMin(iKey=>CountZeros(iDict[iKey]);
返回新字典{{keyofmimimum,iDict[keyofmimimum]};
}

您可以通过稍微修改您的计算值来实现这一点。即:

{
// ...
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;
} 
{
// ...
var minKV=c.ToList()
.OrderBy(k=>计算零(k值))
.First();
控制台写入线(最小千伏键);
//...
}
公共静态整数计算(整数[,]m)
{
整数零=0;
for(int i=0;i
将出现许多矩阵只有零的边缘情况。为循环中的最大值(
max\u couverture
)声明跟踪器变量没有意义,您希望在所有迭代的
条目上得到结果。用一个最小的、完整的实际编译的示例更新您的帖子,目前还不清楚问题出在哪里,因为代码不完整。例如,
calcul\u 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;
}