我正在寻找有关如何以编程方式限制DataTable
中的行数的指导,具体取决于特定的列值。
类似于take(n)
允许我获取特定行数的方式:
// Returns first 10 rows
dt.Rows.Cast<DataRow>().Take(10).CopyToDataTable();
说我有一个DataTable
有4行
+-----------------------------------+------------+ | Col1 | Col2 | +-----------------------------------+------------+ | FRED | | +-----------------------------------+------------+ | BILL | | +-----------------------------------+------------+ | BILL | | +-----------------------------------+------------+ | BOB | | +-----------------------------------+------------+
使用此方案take(2)
将返回2行,但我希望类似的功能返回3,因为Col1的值在第2行和第3行中相同。
循环是否会最快:
var count = 0;
for(int i=0; i < dt.Rows.Count; i++)
{
// add to new DataTable
if(i > 0 && Convert.ToString(dt.Rows[i]["Col1"]) != Convert.ToString(dt.Rows[i-1]["Col1"]))
{
// check next row
count++;
if (count == 10) break;
}
}
还是有其他更简单的解决方案吗?
我正在寻找限于特定数字的不同值,但也要获得所有重复数据。
答案 0 :(得分:1)
您在评论中说:&#34;我希望将不同的值限制为特定的数字,但要获得所有重复项。&#34;。因此,您只需要获取行,直到获取的不同数量的值大于您的限制。为此,hashset是最简单的选项,它会自动将每个不同的值只有一次,即使你多次添加它们也是如此。
var set = new HashSet<string>();
var limit = 2;
var resultingRows = sequence.TakeWhile(row => { set.Add(row[col]); return set.Count <= limit; });
确保序列具体化并按该列排序。
答案 1 :(得分:0)
因此,如果我做对了,你想获得一个排除重复的行列表,如果它们在Col1
中具有相同的值,那么两行被认为是相等的,对吗?
在这种情况下,您可以为行定义IEqualityComparer:
class RowComparer : IEqualityComparer<DataRow>
{
public bool Equals(DataRow x, DataRow y)
{
return x["Col1"] == y["Col1"];
}
public int GetHashCode(DataRow obj)
{
return obj["Col1"].GetHashCode();
}
}
...然后获得&#34;独特的&#34;使用LINQ&#39; Distinct
:
var uniqueRows = dt.Rows.Cast<DataRow>().Distinct(new RowComparer())