我使用 .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
答案 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;
}