【问题标题】:find missing column name and row no of datacolum in linq在 linq 中查找 datacolum 的缺失列名和行号
【发布时间】:2013-11-19 04:56:43
【问题描述】:

我有一个大约 50-60 列的数据表

我有一个这样的列表

  public List<string> strImportRequiredFields = new List<string> { "ENTRY/CMD #", "PART #", "REFERENCE 1", "REFERENCE 2", "REFERENCE 3", "DUTY PER" };

这些是必须在 Datatable 中的列,其值不应为空

如果值为空,它将返回行号和列名,如果可能,用 , 分隔

我浏览了许多链接并结束了这个查询

List<DataRow> dtlist = dtUploadedDat.AsEnumerable().ToList();

            var result = dtlist.Where(p => strImportRequiredFields.Any(t => p[t].ToString().Length <= 0)).ToList();

            string rstring = string.Join(",", result.Select(x => x.ToString()).ToArray());

它只给我计数值,我尝试了不同的条件,但没有把它整理出来

由于该表可能包含 1000 条记录,其中 1000 条记录,所以如果我必须运行循环来检查它,那将是非常糟糕的

我想用 linq 完成它

请帮忙

谢谢

【问题讨论】:

  • 你能提供你想要的小样本输入和输出吗?
  • @Grundy 还需要什么,我已经给出了必填字段列表,数据表将有大约 50-60 个字段,其中这些字段不应为空
  • 但在您的情况下,您测试至少有一个不是空白,而不是全部
  • @Grundy 我对 linq 非常陌生,我尝试使用我得到的链接
  • 尝试我的回答中的代码

标签: c# linq


【解决方案1】:

试试这个:

var result = dtUploadedDat.AsEnumerable()
             .SelectMany((row,i)=>dtUploadedDat.Columns.Cast<DataColumn>()
                  .Where(col=>!strImportRequiredFields.Contains(col.ColumnName)||
                               Convert.ToString(row[col]) == string.Empty)
                  .Select(col=>string.Format("{0},{1}",i+1,col.ColumnName)))
             .ToList();

//sample result
//{"ColumnA,1", "ColumnD,5", "ColumnF,8" } 

结果中的每一项都是一对列名和行索引(用逗号分隔)。

【讨论】:

  • col.name 显示错误,我将其设为列名,但无法找到 row.Index
  • 它会返回一个字符串值吗
  • @MAkela 是的,这就是我所说的,每个条目都是我在示例结果中显示的字符串(3 个条目)。你想要什么样的数据类型?你有任何类来存储信息吗?还是你喜欢一个有 2 个属性的匿名类型(一个是列名,另一个是行索引)?
  • 你说 col=>!strImportRequiredFields.Contains(col.ColumnName) 因为我得到它正在检查 strimportrequiredfields,它不会反转,当我运行代码时我开始撒谎
  • @MAkela 你是什么意思?请在您更新的问题中显示结果,显示您遇到的任何异常,并进一步说明您想要的实际数据类型。
【解决方案2】:

你做了一些小优化

List<DataRow> dtlist = dtUploadedDat.AsEnumerable();

var result = dtlist.Where(p => strImportRequiredFields.All(t => !string.IsNullOrEmpty(p[t].ToString()))); //check that all mandatory field not blank

string rstring = string.Join(",", result);

更新
你可以试试这样的

var result = from r in dtlist.AsEnumerable().Select((r, i) => new { r, i })
             from colName in strImportRequiredFields

             where string.IsNullOrEmpty(Convert.ToString(r.r[colName ]))
             group new { col = colName , rowIndex = r.i } by colName into g
             select new { col=g.Key, rows=string.Join(",", g.Select(a=>a.rowIndex))};

string rstring = string.Join("; ", result.Select(a => a.col + ": " + a.rows));

【讨论】:

  • 但它会返回我的列名和行号
  • @MAkela 我只是不明白需要什么:-)
【解决方案3】:

我已经创建了示例,您可以查看一下

    private void Vaidate_Click(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("ENTRY/CMD #", typeof(int));
        dt.Columns.Add("REFERENCE 1", typeof(string));
        dt.Columns.Add("REFERENCE 3", typeof(string));
        DataRow dr;
        for (int i = 0; i < 20; i++)
        {
            dr = dt.NewRow();
            dr[0] = i;
            dr[1] = "This" + i.ToString();
            dr[2] = "This" + i.ToString();
            dt.Rows.Add(dr);
        }

        dt.Rows[5][2] = "";
        dt.Rows[8][1] = "";
        //int itemFind = 157;
        //int rowindex = dt.Rows.IndexOf(dt.Select("Id=" + itemFind).FirstOrDefault());

        //List<string> strImportRequiredFields = new List<string> { "ENTRY/CMD #", "PART #", "REFERENCE 1", "REFERENCE 2", "REFERENCE 3", "DUTY PER" };
        List<string> strImportRequiredFields = new List<string> { "ENTRY/CMD #", "REFERENCE 1", "REFERENCE 3", };
        List<string> columnsPresent = dt.Columns.Cast<DataColumn>().Select(a => a.ColumnName).ToList();
        List<string> columnsNotPresent = strImportRequiredFields.Except(columnsPresent).ToList();

        if (columnsNotPresent != null && columnsNotPresent.Count > 0)
        {
            MessageBox.Show("Columns must present" + Environment.NewLine + columnsNotPresent.Aggregate((a, b) => a + "," + b));
            return;
        }


        string s = strImportRequiredFields.Aggregate((acc, next) => acc + next + " is Null or");

        var result = dt.AsEnumerable().Where(p => strImportRequiredFields.Any(t => string.IsNullOrEmpty(p[t].ToString())));

        List<int> Invalidrows = new List<int>();

        foreach (DataRow item in result)
        {
            Invalidrows.Add(dt.Rows.IndexOf(item));
        }

        if (Invalidrows != null && Invalidrows.Count > 0)
        {
            MessageBox.Show("some of field data missing in below rows" + Environment.NewLine + Invalidrows.Aggregate(
                        new StringBuilder(),
                        (sb, x) => sb.AppendLine(x.ToString())
                    ));

            return;
        }
    }

【讨论】:

    【解决方案4】:

    试试这个!!!

            StringBuilder sb = new StringBuilder();
    
            dt.AsEnumerable().Select((value, key) => new { value, key }).ToList()
                .ForEach(r => strImportRequiredFields.ForEach(c => { if (r.value[c].ToString().Length <= 0) sb.AppendFormat("\"row:{0},col:{1}\"", r.key, c); }));
    
            Console.WriteLine(sb.ToString());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-06
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      相关资源
      最近更新 更多