将数组的值赋值为变量C#

时间:2017-04-04 09:30:38

标签: c# arrays datagridview

我想在DataGridView中获取列的最大值,所以我使用这行代码:

int temp;
var MaxID2 = dataGridView3.Rows.Cast<DataGridViewRow>()
    .Max(r => int.TryParse(r.Cells[1].Value.ToString(), out temp) ? temp : 0);

它工作正常,但只有1列,我有10列。我可以让它只是复制和粘贴,但必须有一个更好的方法。我尝试使用for循环,但我坚持使用赋值变量。

这是我到目前为止所得到的;我收到类似Can't convert string to int的错误:

int temp;
//string MaxId;
string[] arr1 = new string[10];
arr1[1] = "MaxID1";
arr1[2] = "MaxID2";
arr1[3] = "MaxID3";
arr1[4] = "MaxID4";
arr1[5] = "MaxID5";
arr1[6] = "MaxID6";
arr1[7] = "MaxID7";
arr1[8] = "MaxID8";
arr1[9] = "MaxID9";
arr1[10] = "MaxID10";

for (int ctr = 1; ctr < 11; ctr++)
{
    var arr1[ctr]= dataGridView3.Rows.Cast<DataGridViewRow>()
                .Max(r => int.TryParse(r.Cells[ctr].Value.ToString(), out temp) ?
                            temp : 0);

}

4 个答案:

答案 0 :(得分:1)

您的arr1数组属于string类型,Max函数返回int。您应该使用int类型的数组,或将Max函数结果转换为string

包含int数组的代码:

int temp;

int[] arr1 = new int[10];

for (int ctr = 0; ctr < 10; ctr++)
{
    arr1[ctr] = dataGridView1.Rows.Cast<DataGridViewRow>()
            .Max(r => int.TryParse(r.Cells[ctr].Value.ToString(), out temp) ? temp : 0);
}

intstring转化的代码:

int temp;

string[] arr1 = new string[10];

for (int ctr = 0; ctr < 10; ctr++)
{

    arr1[ctr] = dataGridView3.Rows.Cast<DataGridViewRow>()
                       .Max(r => int.TryParse(r.Cells[ctr].Value.ToString(), out temp) ? temp : 0).ToString();

}

另外,请注意从0开始的ctr计数器。

请参阅有关使用var关键字的问题的Abion47评论。

答案 1 :(得分:1)

替代没有循环和.Cast

int[] arr1 = (from c in Enumerable.Range(1, 10)
              select Enumerable.Range(0, dataGridView1.RowCount)
              .Max(r => Convert.ToInt32(dataGridView1[c, r].Value))).ToArray();

答案 2 :(得分:0)

&#34; MaxID1&#34;因为&#34; MaxID&#34;永远不能成为一个整数部分...

答案 3 :(得分:0)

C#中的数组仅存储您指定类型的值。在您的情况下,您指定数组存储string值,但实际需要的是int数组。此外,您在阵列中进行的冗长准备是不必要的。 (看起来你正试图“命名”数组的每个索引,而不是数组的工作方式。)

以下是一些应该执行您要执行的操作的代码:

int columns = 10;
int[] maxes = new int[columns];

for (int i = 0; i < maxes.Length; i++)
{
    int temp;
    maxes[i] = dataGridView3.Rows
                            .Cast<DataGridViewRow>()
                            .Max(r => int.TryParse(r.Cells[i].Value.ToString(), out temp) 
                                      ? temp 
                                      : int.MinValue);
}

首先,它声明您尝试评估的列数,并将其存储在columns变量中。然后它在maxes数组的实例化中使用该变量,因为如果你知道要处理多少列,那么这就是数组需要的大小。

在for循环中,索引变量i(我使用i因为它是for循环的一个非常常见的约定)从0开始,因为在C#中,第一个索引是一个数组总是* 0.从那里,它与你正在做的几乎完全相同,但是当int.MinValue返回false时它将默认为int.TryParse而不是0。这是为了说明列中的数字可能为负数的情况。

作为替代方案,如果您使用的是C#7.0,则可以调整int.TryParse以使用新形式的out variables

int.TryParse(r.Cells[i].Value.ToString(), out int temp)

这样就无需事先声明int temp;。它是最新版C#的一个简洁的小型语法糖。

*有很多方法可以在C#中创建非零数组,但是它们的用例非常有限。相信我,坚持使用默认数组要好得多,除非你真的知道你在做什么。