比较DataTable中的两行索引

时间:2015-09-28 13:58:57

标签: c# excel linq datatable datarow

我填写了DataTable。 在每一行中,我尝试找到一些必须唯一的字符串值。如果我找到具有该值的行,我需要向下(跳过一些行),直到找到包含Expr1之类的常量字符串的行。现在我需要返回包含Expr1的所有行。

所以有两个条件:

1 - 找到带有输入值的行Row1。 2 - 找到包含const值Row1的{​​{1}}的最近行并返回它。

Expr1

这是我的Excel文件的外观(我写入数据表的Excel文件中的所有数据)

InputValueToFind|
Week1           | 1
Week2           | 2
Week3           | 3
Total           | 6

Expr1           | 4

此代码返回包含DataRow[] netPay = dt.AsEnumerable().Where(row => row[0].ToString().Trim().ToLower().Equals("Expr1".ToLower())).ToArray(); 的DataTable中的所有行。

Expr1

使用此代码,我可以获得for (var i = 0; i < dt.Rows.Count; i++) { if (dt.Rows[i][0].ToString().Trim().ToLower().Equals(inputVal.ToLower())) { // do some stuff } } 行。

问题 - 现在我不知道如何找到与InputValue最接近的行与Expr1一行(换句话说,我不知道如何使用这两个块代码在一起)。

1 个答案:

答案 0 :(得分:0)

如果您在IEnumerable上执行选择,则会有一个可选的通用int TIn参数,您可以按以下方式使用该参数。

Select<DataRow, int, KeyValuePair<int, DataRow>>((row,idx) => new KeyValePair<int, DataRow>(idx, row)

使用该类型,您可以更轻松地执行索引(邻近)检查。

我会为此创建自己的对象类型

public class IndexDataRowPair
{
    public int Index {get;set;}
    public DataRow Row {get;set;}

    // or, just the values you intend to use
    // public string InputValue {get;set;}
    // public string ExpressionValue {get;set;}
}

...

// generic Select<TIn, Tin, TResult> parameters will be inferred:= 
// Select<DataRow, int, IndexDataRowPair> 
dt.Select((row,idx) => new IndexDataRowPair() { Index = idx, Row = row });