Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按datarow中字段的值获取列名_C#_Linq_For Loop_Datarow_Datacolumn - Fatal编程技术网

C# 按datarow中字段的值获取列名

C# 按datarow中字段的值获取列名,c#,linq,for-loop,datarow,datacolumn,C#,Linq,For Loop,Datarow,Datacolumn,我的问题实际上更多的是关于优化我已经在工作的东西。 我很难相信没有更好的方法可以用LINQ查询或lambda表达式来实现这一点,所以我想在这里试试 我的每个datatable行都有一个项目编号和43个数量列,每个列对应一个特定的日期。我试图做的是获取每一行,并找到第一个大于0的quantity列,然后返回该列名称。我的解决方案确实有效,但我真的想让它更有效率: foreach (DataRow r in dt.Rows) { for (int i = 3; i <= dt.Col

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

我的每个datatable行都有一个项目编号和43个数量列,每个列对应一个特定的日期。我试图做的是获取每一行,并找到第一个大于0的quantity列,然后返回该列名称。我的解决方案确实有效,但我真的想让它更有效率:

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
}
foreach(数据行r在dt.行中)
{
对于(int i=3;i 0)
{
tempCol=tempCol.Replace(“Apat”,即“替换”);
打破
}
}
var FirstAvailableDate=WorkDate.AddDays((dec)tempCol).ToSortDateString;
//以某种方式使用数据
}

感谢您提前提出建议

当前代码,每行*每列

  • 获取列的名称
  • 将其存储在变量中
  • 在匹配的情况下,执行字符串。替换
  • 我的建议是:

    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
    }
    
    var allCols=dt.列
    .Cast()
    .Select(col=>col.ColumnName.Replace(“Apat”和“”)
    .ToArray();
    foreach(数据行r在dt.行中)
    {
    第一谷=
    r、 ItemArray.Select((单元格,位置)=>Tuple.Create(Convert.ToInt32(单元格,位置))
    .FirstOrDefault(tuple=>tuple.Item1>0);
    如果(firstCol==null)继续;
    var colName=allCols[firstCol.Item2];
    var FirstAvailableDate=WorkDate.AddDays((dec)colName).ToSortDateString;
    //以某种方式使用数据
    }
    
    当前代码,每行*每列

  • 获取列的名称
  • 将其存储在变量中
  • 在匹配的情况下,执行字符串。替换
  • 我的建议是:

    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
    }
    
    var allCols=dt.列
    .Cast()
    .Select(col=>col.ColumnName.Replace(“Apat”和“”)
    .ToArray();
    foreach(数据行r在dt.行中)
    {
    第一谷=
    r、 ItemArray.Select((单元格,位置)=>Tuple.Create(Convert.ToInt32(单元格,位置))
    .FirstOrDefault(tuple=>tuple.Item1>0);
    如果(firstCol==null)继续;
    var colName=allCols[firstCol.Item2];
    var FirstAvailableDate=WorkDate.AddDays((dec)colName).ToSortDateString;
    //以某种方式使用数据
    }
    
    请更改以下代码

    Tuple.Create(Convert.ToInt32(位置),单元格)

    var colName=allCols[firstCol.Item1]


    工作很好

    请更改以下代码

    Tuple.Create(Convert.ToInt32(位置),单元格)

    var colName=allCols[firstCol.Item1]


    工作很好

    我认为你的样品不合适。我花了三分钟盯着它,试图猜测r方法的作用,结果发现它是一个DataRow,而您使用的是一个使用方括号而不是括号的字符串索引器?这里唯一值得花时间优化的事情是,在创建DataTable时,确保43列的类型都是Int32列,然后调用GetInt或DataRow上的任何方法,而不是执行Convert.ToInt32操作。现在,如果您想将其LINQify,那是另一件事,但重构会使它变慢,而不是变快。是否有大量行的所有值都为0?(顺便说一句,这对我来说是个好问题)。如果你喜欢linq:string[]results=dt.AsEnumerable().Select(x=>x.ItemArray.Select((y,i)=>new{index=i,value=(int)y})。其中(y=>y.value>0)。FirstOrDefault()).Select(x=>dt.Columns[x.index].ColumnName.ToArray();我认为你的样品不合适。我花了三分钟盯着它,试图猜测r方法的作用,结果发现它是一个DataRow,而您使用的是一个使用方括号而不是括号的字符串索引器?这里唯一值得花时间优化的事情是,在创建DataTable时,确保43列的类型都是Int32列,然后调用GetInt或DataRow上的任何方法,而不是执行Convert.ToInt32操作。现在,如果您想将其LINQify,那是另一件事,但重构会使它变慢,而不是变快。是否有大量行的所有值都为0?(顺便说一句,这对我来说是个好问题)。如果你喜欢linq:string[]results=dt.AsEnumerable().Select(x=>x.ItemArray.Select((y,i)=>new{index=i,value=(int)y})。其中(y=>y.value>0)。FirstOrDefault()).Select(x=>dt.Columns[x.index].ColumnName.ToArray();