【问题标题】:Using LINQ to find Excel columns that don't exist in array?使用 LINQ 查找数组中不存在的 Excel 列?
【发布时间】:2013-09-17 00:43:42
【问题描述】:

我有一个适合我想要的解决方案,但我希望获得一些精巧的 LINQ 类型来帮助我改进我所拥有的,并在此过程中学习新的东西。

以下代码用于验证电子表格中是否存在某些列名。我在使用列索引值或列名来查找它们之间纠结。他们都有优点和缺点,但决定使用列名。它们将永远存在,有时以不同的顺序存在,尽管我正在努力。

详情: GetData() 方法从 Excel 电子表格返回 DataTable。我从我的数组中循环浏览所有必需的字段名称,查看它是否与电子表格上的列集合中的某些内容匹配。如果没有,那么我将缺少的列名附加到方法的输出参数中。我需要布尔值和缺失字段变量,我不确定是否有比使用输出参数更好的方法。然后,我从附加字符串中删除最后一个逗号,以便在 UI 上显示。如果StringBuilder 对象不为null(我也可以使用missingFieldCounter),那么我知道至少有一个缺失字段,bool 将为false。否则,我只是将输出参数返回为空,方法返回为真。

那么,有没有一种更灵活、一体化的方法来检查字段是否丢失,并以某种方式报告它们?

 private bool ValidateFile(out string errorFields)
    {

        data = GetData();
        List<string> requiredNames = new [] { "Site AB#", "Site#", "Site Name", "Address", "City", "St", "Zip" }.ToList();

        StringBuilder missingFields = null;
        var missingFieldCounter = 0;

        foreach (var name in requiredNames)
        {

            var foundColumn = from DataColumn c in data.Columns
                              where c.ColumnName == name
                              select c;

            if (!foundColumn.Any())
            {
                if (missingFields == null)
                    missingFields = new StringBuilder();

                missingFieldCounter++;
                missingFields.Append(name + ",");
            }

        }

        if (missingFields != null)
        {
            errorFields = missingFields.ToString().Substring(0, (missingFields.ToString().Length - 1));
            return false;
        }

        errorFields = string.Empty;
        return true;    

    }

【问题讨论】:

    标签: arrays linq excel contains


    【解决方案1】:

    这是相同的 linq 解决方案。 我调用 ToArray() 函数来激活 linq 语句

            (from col in requiredNames.Except(
                    from dataCol in data
                    select dataCol.ColumnName
                    )
                select missingFields.Append(col + ", ")
             ).ToArray();
    
            errorFields = missingFields.ToString();
            Console.WriteLine(errorFields);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多