使用LINQ查找数组中不存在的Excel列?

时间:2013-09-12 14:47:52

标签: arrays linq excel contains

我有一个适合我想要的解决方案,但我希望得到一些灵活的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;    

    }

1 个答案:

答案 0 :(得分:0)

这是使得相同的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);