【问题标题】:Find a Non-Duplicate Row in DataTable在 DataTable 中查找非重复行
【发布时间】:2015-03-23 20:44:03
【问题描述】:

我目前正在扫描 DataTable 以查找“ColumnA”中的非重复值

请注意,我不是在寻找 DISTINCT 值,因为这将返回多行结果。

目前,当我用谷歌搜索“c# Find non-duplicate row”时,我只收到处理删除重复项的结果,这不是我想要做的。

例如:

如果'ColumnA'的每一行都包含:

1

1

1

2

1

我希望能够提取包含 '2' 作为其值的行。

是否有我可以使用的 LINQ 表达式来执行此操作?我发现了其他一些 SO 问题并找到了接近的答案(除了它们再次返回 DISTINCT 行)。

我知道使用 SQL 我可以使用 Count() 表达式来计算行的实例,但我是从 C# 类中执行此操作的。

提前致谢。

【问题讨论】:

    标签: c# linq datatable


    【解决方案1】:

    在 LINQ 和 SQL 中,您将为此使用 group by 构造,然后按计数限制结果。不同之处在于,在 SQL 中您将使用HAVING,而在 LINQ 中您将继续使用Where

    这是它在 LINQ 中的样子:

    var res = source
        .GroupBy(item => item.ColumnA)
        .Where(g => g.Count() == 1)
        .Select(g => g.Single());
    

    【讨论】:

    • 嘿,这太棒了。谢谢你。它返回了我需要的单行结果。如何访问 ItemArray 中的各个对象?
    • @terbubbs ItemArray 是什么意思?您是否将结果转换为数组(即在Select(g=>g.Single()) 之后添加.ToArray()
    • 抱歉给您带来了困惑。在您的示例中,当 LINQ 生成“res”时,我如何从中提取数据?我必须通过在 .GroupBy() 前面标记“AsEnumerable()”来稍微重新格式化 LINQ,这样我才能让它工作。当我向“var res”添加断点时,我查看了对象并找到了我需要的结果数组。我试图做 'res[0]' 来拉动单个对象,但没有奏效。
    • @terbubbs LINQ 查询返回IEnumerable<...>,因此如果您想使用索引器,您需要调用ToArray()ToList()res。但是,如果您宁愿使用 foreach 循环遍历结果,则不必这样做,如 foreach (var item in res) {...}
    • 啊啊啊好吧。这就说得通了。一天结束的时候放屁。谢谢。
    猜你喜欢
    • 2011-09-28
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2013-02-03
    相关资源
    最近更新 更多