如何在 Linq 查询中添加 Where Not Equals 条件
How to Add a Where Not Equals condition in Linq query
我用这段代码 cast
我的 DataGridView
然后在另一个 DataGridView
.
中显示结果
基本上,我得到一些 int 值并计算它们的总和,同时还将这些值与 GroupBy
分组。
我在另一个 DataGridView
中显示结果,如下所示:
datagridview2.DataSource= Su.ToList();
我的问题是,如果单元格具有字符串值,查询似乎会停止。
我尝试添加“where
not”条件以通过多种不同方式排除包含字符串值的行,但没有成功。
这是我尝试过的条件示例:
.Where(row => !row.Cells[2].Value.ToString().Equals("example"))
此代码在 datagridview_cellvaluechanged
方法中:
try
{
var Su = dataGridView1.Rows.Cast<DataGridViewRow>()
.Where(row => row.Cells[8].Value != null)
.Where(row => row.Cells[2].Value != null)
.GroupBy(row => row.Cells[8].Value.ToString())
.Select(g => new
{
Gruppo = g.Key,
Serie = g.Sum(row => Convert.ToInt32(row.Cells[2].Value)),
Reps = g.Sum(row => Convert.ToInt32(row.Cells[3].Value) * Convert.ToInt32(row.Cells[2].Value)),
Percent = (g.Sum(row => Convert.ToDecimal(row.Cells[2].Value)) / Convert.ToDecimal(label15.Text)) * 100
});
}
catch (FormatException)
{
//MessageBox.Show("Formato non corretto");
}
如果成功,这就是 DataGridView 的外观; dgv1:
column 1 | column 2 |column 3
2 3 group1
3 5 group1
4 6 group2
3 4 group3
我在 dgv2 的结果中看到了这一点:
column 1 | column 2 |column 3
5 8 group1
4 6 group2
3 4 group3
但是如果我像这样在 column2 中添加一个字符串值:
column 1 | column 2 |column 3
2 3 group1
3 5 group1
4 string group2
3 4 group3
然后我在 dgv2 的结果中看到了这个:
column 1 | column 2 |column 3
5 8 group1
虽然我还没有完全确定问题出在哪里,但我会尝试回答您的问题。
首先,如果您不能 100% 确定特定单元格包含 Int 值,则不应盲目转换它。
有一些方法可以在转换之前检查它是否为 int。一种方法是:
try
{
var Su = dataGridView1.Rows.Cast<DataGridViewRow>()
.Where(row => row.Cells[8].Value != null)
.Where(row => row.Cells[2].Value != null)
.GroupBy(row => row.Cells[8].Value.ToString())
.Select(g => new
{
Gruppo = g.Key,
Serie = g.Sum(row => {
if(row.Cells[2].Value is int rowInteger)
return rowInteger;
// if it is not an integer then try to convert
// return a default value (in this case -1) if it can't be converted
else
{
try
{
return Convert.ToInt32(row)
}
catch(Exception)
{
return -1;
}
}
},
Reps = g.Sum(row => Convert.ToInt32(row.Cells[3].Value) * Convert.ToInt32(row.Cells[2].Value)),
Percent = (g.Sum(row => Convert.ToDecimal(row.Cells[2].Value)) / Convert.ToDecimal(label15.Text)) * 100
});
}
catch (FormatException)
{
//MessageBox.Show("Formato non corretto");
}
这将确保保留所有行,但只计算有效的行。
一种不保留原始行数的更简单的方法是检查单元格的值是否为 int 或是否可以转换为 int,即添加以下 Where
语句:
Where(row => row.Cells[2].Value is int || int.TryParse((row.Cells[2].Value as string), out var result))
请注意,您实际上是在每次迭代中解析值并丢弃结果,这当然远未得到优化,但会得到您想要的结果。
我用这段代码 cast
我的 DataGridView
然后在另一个 DataGridView
.
基本上,我得到一些 int 值并计算它们的总和,同时还将这些值与 GroupBy
分组。
我在另一个 DataGridView
中显示结果,如下所示:
datagridview2.DataSource= Su.ToList();
我的问题是,如果单元格具有字符串值,查询似乎会停止。
我尝试添加“where
not”条件以通过多种不同方式排除包含字符串值的行,但没有成功。
这是我尝试过的条件示例:
.Where(row => !row.Cells[2].Value.ToString().Equals("example"))
此代码在 datagridview_cellvaluechanged
方法中:
try
{
var Su = dataGridView1.Rows.Cast<DataGridViewRow>()
.Where(row => row.Cells[8].Value != null)
.Where(row => row.Cells[2].Value != null)
.GroupBy(row => row.Cells[8].Value.ToString())
.Select(g => new
{
Gruppo = g.Key,
Serie = g.Sum(row => Convert.ToInt32(row.Cells[2].Value)),
Reps = g.Sum(row => Convert.ToInt32(row.Cells[3].Value) * Convert.ToInt32(row.Cells[2].Value)),
Percent = (g.Sum(row => Convert.ToDecimal(row.Cells[2].Value)) / Convert.ToDecimal(label15.Text)) * 100
});
}
catch (FormatException)
{
//MessageBox.Show("Formato non corretto");
}
如果成功,这就是 DataGridView 的外观; dgv1:
column 1 | column 2 |column 3
2 3 group1
3 5 group1
4 6 group2
3 4 group3
我在 dgv2 的结果中看到了这一点:
column 1 | column 2 |column 3
5 8 group1
4 6 group2
3 4 group3
但是如果我像这样在 column2 中添加一个字符串值:
column 1 | column 2 |column 3
2 3 group1
3 5 group1
4 string group2
3 4 group3
然后我在 dgv2 的结果中看到了这个:
column 1 | column 2 |column 3
5 8 group1
虽然我还没有完全确定问题出在哪里,但我会尝试回答您的问题。
首先,如果您不能 100% 确定特定单元格包含 Int 值,则不应盲目转换它。
有一些方法可以在转换之前检查它是否为 int。一种方法是:
try
{
var Su = dataGridView1.Rows.Cast<DataGridViewRow>()
.Where(row => row.Cells[8].Value != null)
.Where(row => row.Cells[2].Value != null)
.GroupBy(row => row.Cells[8].Value.ToString())
.Select(g => new
{
Gruppo = g.Key,
Serie = g.Sum(row => {
if(row.Cells[2].Value is int rowInteger)
return rowInteger;
// if it is not an integer then try to convert
// return a default value (in this case -1) if it can't be converted
else
{
try
{
return Convert.ToInt32(row)
}
catch(Exception)
{
return -1;
}
}
},
Reps = g.Sum(row => Convert.ToInt32(row.Cells[3].Value) * Convert.ToInt32(row.Cells[2].Value)),
Percent = (g.Sum(row => Convert.ToDecimal(row.Cells[2].Value)) / Convert.ToDecimal(label15.Text)) * 100
});
}
catch (FormatException)
{
//MessageBox.Show("Formato non corretto");
}
这将确保保留所有行,但只计算有效的行。
一种不保留原始行数的更简单的方法是检查单元格的值是否为 int 或是否可以转换为 int,即添加以下 Where
语句:
Where(row => row.Cells[2].Value is int || int.TryParse((row.Cells[2].Value as string), out var result))
请注意,您实际上是在每次迭代中解析值并丢弃结果,这当然远未得到优化,但会得到您想要的结果。