【问题标题】:DataTable select distinct values from several columnsDataTable 从多列中选择不同的值
【发布时间】:2011-09-13 18:34:35
【问题描述】:

我总是需要你的帮助:)

我得到了一个DataTable,其中包含以下列:

TITLE ADDRESS BRANCH BRANCH1 BRANCH2 BRANCH3

因为我不想执行另一个 MySql 查询来只获取分支, 我想我可以对DataTable 进行LINQ 查询并获得不同的值。

男孩,我错了......它并不像我想象的那么简单。

任何人都可以帮助我吗? (首选 Lambda 表达式)

编辑:

如果我不清楚,我需要所有行中的所有分支。

【问题讨论】:

    标签: c# linq lambda datatable


    【解决方案1】:

    试试这个:-

    var rows = dataTable.AsEnumerable();
    rows.Select(x => x["BRANCH"])
        .Union(rows.Select(x => x["BRANCH1"]))
        .Union(rows.Select(x => x["BRANCH2"]))
        .Union(rows.Select(x => x["BRANCH3"]));
    

    这会获取表中所有 BRANCH 列中的所有值,并使用 Union() a) 将它们连接到一个列表中 b) 删除重复项,从而为您提供不同的值。

    (注意:Union() 函数会删除重复值。为了保留重复值,可以使用Concat() 代替Union()

    --- 编辑 ---

    如果你想丢弃空值,用户Where(),例如:-

    var rows = dataTable.AsEnumerable();
    rows.Select(x => x["BRANCH"])
        .Union(rows.Select(x => x["BRANCH1"]))
        .Union(rows.Select(x => x["BRANCH2"]))
        .Union(rows.Select(x => x["BRANCH3"]))
        .Where(x => x != null);
    

    【讨论】:

    • 是否有可能丢弃空值?
    • 请注意,在答案的原始版本中,我对 Distinct() 进行了冗余调用-我已将其删除并添加了注释
    【解决方案2】:

    定义你自己的IEqualityComparer

    public class MyComparer : IEqualityComparer<DataRow>
    {
       public bool Equals(DataRow x, DataRow y) {
          // logic to distinguish the branches
          // this is just an example.  
          return x["BRANCH"] == y["BRANCH"] 
                    && x["BRANCH1"] == y["BRANCH1"]
                    && x["BRANCH2"] == y["BRANCH2"]
                    && x["BRANCH3"] == y["BRANCH3"];
    
       }
    
       public int GetHashCode(DataRow obj) {
          // logic to distinguish the branches
          // this is just an example.
          return obj["BRANCH"].GetHashCode() +
                      obj["BRANCH1"].GetHashCode() +
                      obj["BRANCH2"].GetHashCode() +
                      obj["BRANCH3"].GetHashCode() ;
       }
    }
    

    并使用它

    var result = dataTable.AsEnumerable().Distinct(new MyComparer());
    

    【讨论】:

    • 这将只返回第一个分支,其他分支呢?
    • @Dementic 为什么说它只会返回第一个分支? dataTable.AsEnumerable() 返回所有数据行,并且 Distinct() 根据比较器中的逻辑将其过滤为唯一的数据行。
    • 因为我没有看到任何对 Branch1、branch2 等的引用?
    • @dementic 我刚刚给了你一个示例实现。您可以扩展它以适应您的逻辑。例如。如果您想查看 Branch 和 Branch1,请使用 return x["BRANCH"] == y["BRANCH"] &amp;&amp; x["BRANCH1"] == y["BRANCH1"],对于 GetHashCode,您可以执行类似的操作 return obj["BRANCH"].GetHashCode() + obj["BRANCH1"].GetHashCode()
    • 感谢您抽出宝贵的时间,但对于我的问题,亚当的回答是最好的。
    猜你喜欢
    • 2013-07-02
    • 2013-02-10
    • 2011-11-25
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多