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

时间:2015-08-06 06:11:50

标签: c# linq

我使用 .Net framwork 4.0和 WinForm应用程序组件DataGridView并将DataSource设置为DataTable。然后有一个按钮可以将行添加到{{1 }}

这样的代码。

DataGridView

在将新行添加到 DataTable 之前,我检查了是否存在重复的行。为此,我使用了此gridTable = (DataTable)dgrMainGrid.DataSource; DataRow dr = gridTable.NewRow(); 查询。

LINQ

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

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

在进入下一步之前我需要获取是否有重复,并将其设置为isNotDuplicate变量或类似的东西来检查。所以我认为算一算if(//doWhatever function here ){ //if there's duplicate row values isNotDuplicate = false; } else{ isNotDuplicate=true; } 行,但没有这样的函数可以计算'var results`,有没有可能做到这一点?

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; } for loop一起使用,并检查它是否包含等于“商品代码”的新值,但我正在寻找使用linq的替代方法。

我只是想用linq替换它。

DataTable
  

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

     

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

3 个答案:

答案 0 :(得分:1)

如果您要查找任何特定Item Code或任何商品代码的重复项,您还没有在DataTable中明确说明。无论如何,这里是两个场景的代码: -

如果您要查找任何特定Item Code的重复项,那么您只需查看这样的计数: -

bool istxtGrdItmLocDuplicate = gridTable.AsEnumerable()
                        .Count(x => x.Field<string>("ItemCode") == txtGrdItmLoc.Text) > 1;

如果您要在整个DataTable中查找重复项,那么只需按Item Code分组,并检查每个项目代码的相应计数,如下所示: -

bool isDuplicate = gridTable.AsEnumerable()
                            .GroupBy(x => x.Field<string>("ItemCode")
                            .Any(x => x.Count() > 1);

答案 1 :(得分:0)

首先将其投射到IEnumerable:

Convert DataRowCollection to IEnumerable<T>

然后你可以使用LINQ扩展方法做这样的事情(检查所有有重复的值):

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

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

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

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

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;
    }
}

并使用它:

results.MyCount(r => r.Field<string>("Item Code") == "Item Code");

答案 2 :(得分:0)

IEnumerable<T>有一个Count()方法(check here),如果你没有在intellisense中看到它,那么你会遗漏一些using指令,例如using System.Linq;或其他一些......

然后你会这样做:

if(results.Count()>0){
 //if there's duplicate row values 
 isNotDuplicate = false;
}
else
{
  isNotDuplicate=true;
}