我想在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);
}
答案 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);
}
int
到string
转化的代码:
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#中创建非零数组,但是它们的用例非常有限。相信我,坚持使用默认数组要好得多,除非你真的知道你在做什么。