如何在 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))

请注意,您实际上是在每次迭代中解析值并丢弃结果,这当然远未得到优化,但会得到您想要的结果。