检查分隔字符串的联合是否重复

本文关键字:是否 分隔 字符串 检查 | 更新日期: 2023-09-27 18:15:05

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

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

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

检查分隔字符串的联合是否重复

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

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

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

然而,如果你想添加很多新项目,这是非常低效的。这是一个(大概)O(n^2)的操作。如果你把键加到HashSet<T>,你可以把它降低到0 (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);
        ...
    }
}