检查重复的分隔字符串的并集

时间:2015-09-28 13:21:44

标签: c# linq

我有一个名为PM.INX的文本文件,它是一个以逗号分隔的文件详细信息列表,每行有四个字段。文件(大约12个,文件名不同但结构相同)可以包含20-30行或几百行。几个示例行看起来像:

"2FLAT0.6","2FLAT0£6",2,33.82  
"BZ95M","BZ95M",1,36.26  
  • 字段1是实际名称;
  • 字段2是重命名的文件,其中任何全站点,&符号或加号更改为'£';
  • 字段3是性别代码 - 男性为1,女性为2;和
  • 字段4是文件中项目的校验和总数。

当用户想要添加新项目时,我需要检查是否已存在,因此需要拆分每一行并检查新项目是否已存在,与第一项进行比较。
所以我可以将文件读入一个字符串[],然后循环遍历每个项目,按行拆分数据并检查我的新项目,但是想知道是否还有另一种(LINQ?)方法可以做到这一点?

2 个答案:

答案 0 :(得分:2)

你可以这样做(未经测试)。

items
    .Select(x=>x.Split(',').Select(y=>y.Trim()).ElementAt(0))
    .Any(x=>x == newfilename);

答案 1 :(得分:0)

如果您只想添加一个新项目,最简单快捷的方法是读取每一行,并将新项目的密钥与所有其他项目的密钥进行比较。

但是,如果要添加许多新项目,则效率非常低。它是(大致)O(n ^ 2)操作。如果将密钥添加到HashSet<T>,则可以将其降低到O(n)操作。访问哈希集具有恒定的访问时间O(1)。

伪代码

var keys = new HashSet<string>();
foreach (line in file) {
    string[] parts = line.Split(',');
    keys.Add(parts[0];
}

foreach (newKey in newKeys) {
    if (keys.Contains(newKey)) {
        // Item already exists
        ...
    } else {
        // New item
        keys.Add(newKey);
        ...
    }
}