【问题标题】:Check union of delimited strings for duplicates检查分隔字符串的并集是否有重复项
【发布时间】:2015-09-28 21:38:51
【问题描述】:

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

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

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

【问题讨论】:

  • LINQ 比循环有什么好处?你的循环是什么样的?您将需要阅读整个文件并以任何方式解析所有行。
  • 我只提到了 LINQ,因为我知道如果我只检查整行 fileContent.Intersect(newContent).Any() 但想问这个问题,它可以正常工作。

标签: c# linq


【解决方案1】:

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

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

【讨论】:

  • 谢谢@Niyoko。我有戏!
【解决方案2】:

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

但是,如果要添加许多新项目,这是非常低效的。这是一个(大约)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);
        ...
    }
}

【讨论】:

  • 谢谢@Oliver。它可能是一个或几个新项目,这是我问这个问题的部分原因,因为我不热衷于循环多次检查每个文件。谢谢。马丁
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 2012-11-12
  • 2017-02-01
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多