按索引比较 DataTable 中的两行

Compare two rows from DataTable by their indexes

我已经填充了DataTable。 在每一行中,我都试图找到一些必须唯一的字符串值。如果我找到具有该值的行,我需要向下(跳过一些行)直到找到具有某些常量字符串(如 Expr1)的行。现在我需要 return 包含 Expr1.

的所有行

所以有两个条件:

1 - 查找具有输入值的行 Row1。 2 - 找到最接近 Row1 的包含常量值 Expr1 和 return 的行。

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

Expr1           | 4

这是我的 Excel 文件的样子(我将 Excel 文件中的所有数据写入数据表)


DataRow[] netPay = dt.AsEnumerable().Where(row => row[0].ToString().Trim().ToLower().Equals("Expr1".ToLower())).ToArray(); 

此代码 return 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 最接近的行与 InputValue 的行(换句话说,我不知道如何使用这两个代码块在一起)。

如果对 IEnumerable 执行 Select,则有一个可选的泛型 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 });