获取Datatable行之间的公共值

本文关键字:之间 Datatable 获取 | 更新日期: 2023-09-27 18:12:43

我有一个这样的数据表:

| 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    |

我该怎么做?

获取Datatable行之间的公共值

我不确定如何存储数据表,但使用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并尝试。我首先检查计数,以确保序列为空时没有异常。

我自己没有想到这个逻辑,参考了这个答案:如何从DataTable

中使用Linq查找重复记录

解释:

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