DataTable选择LiNQ并检查是否有重复的行

Els*_*han 5 c# linq

我使用的.Net framwork 4.0 WinForm应用程序组件DataGridView,并设置DataSourceDataTable.然后有一个按钮来添加行插入DataGridView.

这样的代码.

gridTable = (DataTable)dgrMainGrid.DataSource; 
DataRow dr = gridTable.NewRow();
Run Code Online (Sandbox Code Playgroud)

在将New Row添加到DataTable之前,我检查了是否有重复的行.为此,我使用了此LINQQuery.

//Item Code cannot duplicate
var results = from itmCode in gridTable.AsEnumerable()
              where (itmCode.Field<string>("Item Code") == txtGrdItmLoc.Text)
              select itmCode;
Run Code Online (Sandbox Code Playgroud)

在我如何检查数据表中是否有可用的重复行之后?

if(//doWhatever function here ){
  //if there's duplicate row values 
  isNotDuplicate = false;
}
else{
  isNotDuplicate=true;
}
Run Code Online (Sandbox Code Playgroud)

在进入下面的步骤之前,我需要得到是否有重复,并将其设置为isNotDuplicate变量或类似的东西来检查.所以我认为计算results行但是没有这样的函数可以计算'var results`,有没有可能做到这一点?

if (!isDuplicate)
{
     dr["#"] = true;
     dr["Item Code"] = lSysItemCode;
     dr["Stock Code"] = txtGdrItmItemLoc.Text;
     dr["Brand"] = txtGrdItmBrand.Text;
     dr["Model No"] = cmbGrdItmModel.SelectedValue.ToString();
     gridTable.Rows.Add(dr);
     dgrMainGrid.DataSource = gridTable;
}
Run Code Online (Sandbox Code Playgroud)

我可以用for loopDataTable,并检查它是否是含有相当于新价值"产品编号",但我期待与LINQ的替代方法.

简单地说,我正在使用linq替换它.

foreach (DataRow r in gridTable.Rows) {
             if (r["Item Code"].ToString() == txtGrdItmLoc.Text) {
                    isDuplicate = true;
             }
        }
Run Code Online (Sandbox Code Playgroud)

示例项目:http://1drv.ms/1K4JnHt

示例代码:http://pastebin.com/v7NMdUrf

Fab*_*jan 0

首先将其转换为 IEnumerable :

将 DataRowCollection 转换为 IEnumerable<T>

然后,您可以使用 LINQ 扩展方法执行类似的操作(检查所有具有重复项的值):

var duplicates = resultsList.Where(r => resultsList.Count(r2 => r2.Field<string>("Item Code") == r.Field<string>("Item Code")) > 0);
Run Code Online (Sandbox Code Playgroud)

如果您想检查每个值是否重复,可以使用.Count方法,如下所示:

bool hasDuplicates = resultsList.Count(r2 => r2.Field<string>("Item Code") == "your code") > 1;
Run Code Online (Sandbox Code Playgroud)

好的,如果由于某种原因这不起作用,你可以自己编写这个函数:

public static class Helper
{
                                    // or other collection type
    public static int MyCount<T>(this IEnumerable<T> collection, Func<T, bool> function)
    {            
        int count = 0;
        foreach (T i in collection)
            if (function(i)) ++count;
        return count;
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

results.MyCount(r => r.Field<string>("Item Code") == "Item Code");
Run Code Online (Sandbox Code Playgroud)