按数据行

时间:2017-06-27 21:58:54

标签: c# linq for-loop datarow datacolumn

我的问题实际上是关于优化我已经工作过的东西。  我很难相信没有更好的方法来使用LINQ查询或lambda表达式,所以我想我会在这里尝试。

我的每个数据表行都有一个项目编号和43个数量列,每个列对应一个特定的日期。我要做的是取每一行,找到大于0的第一个数量列并返回该列名。我的解决方案确实有效,但我真的希望提高效率:

foreach (DataRow r in dt.Rows) 
{
    for (int i = 3; i <= dt.Columns.Count - 1; i++) 
    {
        tempCol = dt.Columns(i).ColumnName.ToString();
        rowValue = Convert.ToInt32(r(tempCol));
        if (rowValue > 0) 
        {
            tempCol = tempCol.Replace("Apat", "");
            break;
        }
    }

    var FirstAvailableDate = WorkDate.AddDays((dec)tempCol).ToShortDateString;
    //use data in someway
}

提前感谢任何建议!!

2 个答案:

答案 0 :(得分:1)

当前代码,每行*每列

  1. 获取列名称
  2. 将其存储在变量
  3. 中 匹配案例中的
  4. 执行String.Replace
  5. 我的建议:

    var allCols = dt.Columns
                    .Cast<DataColumn>()
                    .Select(col => col.ColumnName.Replace("Apat", ""))
                    .ToArray();
    
    foreach (DataRow r in dt.Rows)
    {
        var firstCol =
        r.ItemArray.Select((cell, position) => Tuple.Create(Convert.ToInt32(cell), position))
                   .FirstOrDefault(tuple => tuple.Item1 > 0);
    
        if(firstCol == null) continue;        
    
        var colName = allCols[firstCol.Item2];
    
        var FirstAvailableDate = WorkDate.AddDays((dec)colName).ToShortDateString;
        //use data in someway
    }
    

答案 1 :(得分:0)

请更改以下代码

Tuple.Create(Convert.ToInt32(position),cell)

var colName = allCols [firstCol.Item1];

工作正常... !!!