【问题标题】:Get column name by value of field in datarow通过数据行中的字段值获取列名
【发布时间】:2023-04-09 18:37:01
【问题描述】:

我的问题实际上更多是关于优化我已经在工作的东西。 我很难相信没有更好的方法可以使用 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
}

提前感谢您的任何建议!

【问题讨论】:

  • 我认为您的示例无法编译。我花了三分钟盯着它,试图猜测 r 方法的作用,结果发现它是一个 DataRow 并且您使用的是使用方括号而不是括号的字符串索引器。
  • (dec) 是什么?
  • 这里唯一可能值得花时间优化的事情是确保在创建 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}).Where(y => y.value > 0).FirstOrDefault()).Select(x => dt.Columns[x.index].ColumnName).ToArray();

标签: c# linq for-loop datarow datacolumn


【解决方案1】:

当前代码,每行*每列

  1. 获取列名
  2. 将其存储在变量中
  3. 在匹配情况下执行 String.Replace

我的建议:

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
}

【讨论】:

    【解决方案2】:

    请更改以下代码

    Tuple.Create(Convert.ToInt32(position), 单元格)

    var colName = allCols[firstCol.Item1];

    工作正常...!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多