使用.Except,不区分大小写C#

时间:2014-06-23 19:23:42

标签: c#

我正在开发一个读取2个csv文件的项目:

var myFullCsv = ReadFile(myFullCsvFilePath);
var masterCsv = ReadFile(csvFilePath);

然后创建一个新的var,其中包含myFullCsv中存在但不包含主Csv的额外行。代码很棒,因为它很简单:

var extraFilesCsv = myFullCsv.Except(masterCsv);

读入的csv文件包含如下数据:

c01.jpg,95182,24f77a1e,\Folder1\FolderA\,
c02.jpg,131088,c17b1f13,\Folder1\FolderA\,
c03.jpg,129485,ddc964ec,\Folder1\FolderA\,
c04.jpg,100999,930ee633,\Folder1\FolderA\,
c05.jpg,101638,b89f1f28,\Folder1\FolderA\,

但是,我刚刚发现每个文件中某些字符不匹配的情况。例如(JPG in caps):

c01.JPG,95182,24f77a1e,\Folder1\FolderA\,

如果数据是这样的,那么它不包含在extraFilesCsv中,但我需要它。任何人都可以告诉我如何使这段代码对文本的情况不敏感吗?

编辑:对不起,我忘了ReadFile不是标准命令。这是代码:

public static IEnumerable<string> ReadFile(string path)
        {
            string line;

            using (var reader = File.OpenText(path))
                while ((line = reader.ReadLine()) != null)
                    yield return line;
        }

1 个答案:

答案 0 :(得分:5)

我假设你已经读过两个csv文件并且有一个代表每个文件的字符串集合。

您可以在EqualityComparer的调用中指定一个特定的Except(),它指示在两个对象集合之间进行比较的类型。

您可以创建自己的比较器,或者假设两个集合都是字符串,请尝试指定忽略大小写的现有比较器:

var extraFilesCsv
    = myFullCsv.Except(masterCsv, StringComparer.CurrentCultureIgnoreCase);

默认情况下,如果您没有指定比较器,它会使用EqualityComparer<TElement>.Default,它会根据您要比较的类类型而有所不同。

对于字符串,默认情况下它首先进行直接a==b比较,这是区分大小写的。 string 类的确切实现稍微复杂一些,但可能不必在此处发布。)