获取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 |
我该怎么做?
我不确定如何存储数据表,但使用linq可以这样做:
您需要首先添加对System.Data.DataSetExtensions
和System.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。