C# 检查分隔字符串的并集是否存在重复项

C# 检查分隔字符串的并集是否存在重复项,c#,linq,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是文件中项目的校验和总和 当用户想要添加一个新项目时,我

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

"2FLAT0.6","2FLAT0£6",2,33.82  
"BZ95M","BZ95M",1,36.26  
  • 字段1是实际名称
  • 字段2是重命名的文件,其中任何句号、符号或加号都被更改为“£”
  • 字段3为性别代码-1为男性,2为女性;及
  • 字段4是文件中项目的校验和总和
当用户想要添加一个新项目时,我需要检查该项目是否已经存在,因此需要拆分每一行,并与第一个项目相比,检查新项目是否已经存在。
因此,我可以将文件读入字符串[],然后循环遍历每个项目,按行分割数据并对照我的新项目进行检查,但我想知道是否有其他(LINQ?)方法可以做到这一点?

您可以这样做(未经测试)


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

但是,如果您想添加许多新项目,这是非常低效的。这是一个(大致)O(n^2)操作。如果将键添加到
哈希集
,则可以将其降为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);
        ...
    }
}
var keys=newhashset();
foreach(文件中的行){
string[]parts=line.Split(',');
添加(部件[0];
}
foreach(newKey中的newKey){
if(key.Contains(newKey)){
//项目已存在
...
}否则{
//新项目
keys.Add(newKey);
...
}
}

LINQ比循环有什么好处?你的循环看起来像什么?你需要阅读整个文件并以任何方式解析所有行。我只提到了LINQ,因为我知道如果我只检查整行
fileContent.Intersect(newContent).any()
但我想问这个问题。谢谢@Niyoko。我会有一个剧本的!谢谢@Oliver。它可能是一个或多个新项目,这也是我问这个问题的部分原因,因为我不想多次循环检查每个文件。谢谢。Martin
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);
        ...
    }
}