从表中获取特定数量的行,具体取决于列值

时间:2018-06-05 14:38:12

标签: c# .net

我正在寻找有关如何以编程方式限制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;
    }
}

还是有其他更简单的解决方案吗?

我正在寻找限于特定数字的不同值,但也要获得所有重复数据。

2 个答案:

答案 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())