获取Datatable行中的公共值

时间:2016-10-12 01:42:27

标签: c#

我有一个像这样的DataTable:

| Supplier  | Product | Price | NewPrice | Category | Quality |
|-----------|---------|-------|----------|----------|---------|
| Supplier1 | Orange  | 100   | 105      | Food     | Good    |
| Supplier2 | Orange  | 110   | 130      | Food     | Good    |
| Supplier3 | Orange  | 200   | 250      | Food     | Good    |

我需要一个具有每列常用值的新DataRow

| Supplier  | Product | Price | NewPrice | Category | Quality |
|-----------|---------|-------|----------|----------|---------|
| Supplier1 | Orange  | 100   | 105      | Food     | Good    |
| Supplier2 | Orange  | 110   | 130      | Food     | Good    |
| Supplier3 | Orange  | 200   | 250      | Food     | Good    |
|-----------|---------|-------|----------|----------|---------|
|           | Orange  |       |          | Food     | Good    |

我该怎么做?

1 个答案:

答案 0 :(得分:0)

我不确定如何存储数据表,但使用linq可以按如下方式完成:

您需要先添加对System.Data.DataSetExtensionsSystem.linq

的引用
var count = dt.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() == dt.AsEnumerable().Count()).Count();
object result;
if (count == 1)
    result = dt.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() == dt.AsEnumerable().Count()).First().Key;
else
    result = "";        //or null, depending on what you need

result显示第0列的所有行中出现的值,否则为空字符串。例如,在您使用r[1]代替r[0]的情况下,结果将显示为Orange

使用您的数据表名称重命名dt并尝试一下。我首先检查计数,以确保序列为空时没有异常。

我自己没有提出这个逻辑,参考了这个答案: How to find duplicate record using Linq from DataTable

说明:

首先在所有行的列值上使用GroupBy() 按相同值对其进行分组。然后检查每个计数是否等于总行数,这相当于检查值是否出现在所有行中。如果成功,我们会找到您的值,否则将结果设置为空字符串 null