首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在DataTable中创建一个仅包含具有Linq的唯一值的C#

在DataTable中创建一个仅包含具有Linq的唯一值的C#
EN

Stack Overflow用户
提问于 2020-11-25 09:42:54
回答 2查看 128关注 0票数 3

我有DataTable dt_Candidates

代码语言:javascript
运行
复制
      Candidate      |   First Name   |   Last Name   
 --------------------|----------------|--------------- 
  John, Kennedy      | John           | Kennedy       
  Richard, Nixon     | Richard        | Nixon         
  Eleanor, Roosevelt | Eleanor        | Roosevelt     
  Jack, Black        | Jack           | Black         
  Richard, Nixon     | Richard        | Nixon         

我想在没有嵌套循环的情况下创建,最好使用Linq,一个包含DataTable的只包含的唯一值,如这个称为dt_Candidates2的值

代码语言:javascript
运行
复制
      Candidate      |   First Name   |   Last Name   
 --------------------|----------------|--------------- 
  John, Kennedy      | John           | Kennedy       
  Eleanor, Roosevelt | Eleanor        | Roosevelt     
  Jack, Black        | Jack           | Black         

和一个名为RejectedCandidates的列表或数组,其中包含不同的重复项。

代码语言:javascript
运行
复制
RejectedCandidates = {"Richard, Nixon"}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-25 10:51:39

如前所述,我不认为它真的需要LINQ这里。可以是这样的:

代码语言:javascript
运行
复制
DataTable dt = new DataTable();
dt.Columns.Add("Candidate");
dt.Columns.Add("First");
dt.Columns.Add("Last");
dt.PrimaryKey = new []{ dt.Columns["Candidate"] }; //means that dt.Find() will work

while(...){
  string candidate = ...

  if(dt.Rows.Find(candidate) != null)
    RejectList.Add(...);
  else
    dt.Rows.Add(...);
}

避免在.Any上使用LINQ的DataTable。这不仅仅是因为需要转换步骤或扩展库(请看这里)才能开始工作,然后它将使用循环来查找所需的信息;PrimaryKey的内置机制使用哈希表来进行更快的查找。

票数 1
EN

Stack Overflow用户

发布于 2020-11-30 10:50:11

代码语言:javascript
运行
复制
var dt = new DataTable
{
    Columns = {"Candidate", "First Name", "Last Name"},
    Rows = 
    {
        new object [] { "John, Kennedy", "John", "Kennedy"},
        new object [] { "Richard, Nixon", "Richard", "Nixon"},
        new object [] { "Eleanor, Roosevelt", "Eleanor", "Roosevelt"},
        new object [] { "Jack, Black", "Jack", "Black"},
        new object [] { "Richard, Nixon", "Richard", "Nixon"},
    }
};

您可以使用分组(groupBy)查找副本,过滤掉它们,然后使用DataTableExtensions.CopyToDataTable扩展方法创建一个新的DataTable:

代码语言:javascript
运行
复制
var dt2 = dt.AsEnumerable()

            .GroupBy(r => r["Candidate"])
            .Where(g => g.Count() == 1)

            .Select(g => g.First())
            .CopyToDataTable();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65002056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档