【问题标题】:DataTable select with LiNQ and check is there duplicate rows or not使用 LiNQ 选择 DataTable 并检查是否存在重复行
【发布时间】:2015-10-29 03:28:35
【问题描述】:

我使用 .Net 框架 4.0 和 WinForm 应用程序组件DataGridView 并设置DataSourceDataTable。然后有一个按钮可以将行添加到DataGridView

这样的代码。

gridTable = (DataTable)dgrMainGrid.DataSource; 
DataRow dr = gridTable.NewRow();

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

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

之后我如何检查数据表中是否存在重复行?

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

在进行以下步骤之前我需要获取 是否有重复并将其设置为 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;
}

我可以使用 for loopDataTable 并检查它是否包含等于 "Item Code" 的新值,但我正在寻找 linq 的替代方法。

我只是在寻找使用 linq 的替代品。

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

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

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

【问题讨论】:

  • gridTable.AsEnumerable().GroupBy(g =&gt; g.Field&lt;string&gt;("Item Code")).Where(g =&gt; g.Count() &gt; 0) 将返回您的副本。
  • 复制为..?所有具有相同Item Code的行?
  • 当我添加新项目时,我需要在数据表列“项目代码”中检查该项目
  • @Jimmer - 好的,那么我回答中的第一个查询应该适合你。

标签: c# linq


【解决方案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);

【讨论】:

  • 'EnumerableRowCollection' 不包含 'GroupBy' 的定义,并且找不到接受类型为 'EnumerableRowCollection' 的第一个参数的扩展方法 'GroupBy'(您是否缺少使用指令还是程序集引用?)
  • @GuidoG - 你添加了对 System.Linq 的引用吗?我敢肯定你错过了。
  • 是的,就是这样。这种情况发生得太多了,他们应该修复它,这样它就不会在没有那个 using 的情况下编译,并警告你缺少一个 using...
  • @GuidoG - 但是 Visual Studio 默认添加这些命名空间;)如果您按 _Ctrl + ,它会给您建议。 _
  • 我得到了 VS 2015 专业版,但它从来没有为我做到这一点。一些设置可能吗?
【解决方案2】:

IEnumerable&lt;T&gt; 有一个Count() 方法(check here),如果您没有在智能感知中看到它,那么您缺少一些using 指令,例如using System.Linq; 或其他一些...

那么你会这样做:

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

【讨论】:

  • EnumerableRowCollection&lt;DataRow&gt; 不包含方法 Count()
  • EnumerableRowCollection&lt;DataRow&gt; 实现 IEnumerable&lt;T&gt; 因此它必须包含该方法。我再说一遍,如果你没有在智能感知中看到它,那么你错过了一些东西,但它就在那里。
  • 是的,我在智能感知中看到它(Count())。但是没有错误。
【解决方案3】:

首先将其转换为 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");

【讨论】:

  • 错误:System.Data.EnumerableRowCollection' 不包含 'Count' 的定义,并且没有扩展方法 'Count' 接受类型的第一个参数。*你使用了什么.net 框架版本?*
  • 这很奇怪,先尝试用.ToList() 方法转换它...我会更新我的答案...我使用.Net 4.5 ...用.ToList() 更新了我的答案方法
  • 没有方法 ToList()
  • 您的项目使用什么版本的 .Net 框架? EnumerableRowCollection&lt;DataRow&gt; 类实现了接口 IEnumerable&lt;T&gt; 并且这个接口有很多来自 LINQ 的扩展方法(比如 .Where .Count .ToList),这就是它应该工作的原因......
  • 用自定义Count() 方法更新了我的答案,这应该足以理解总体思路...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
相关资源
最近更新 更多