首页 > 解决方案 > 比较 2 个列表的部分匹配

问题描述

C# 伙计们! 我有 2 个要比较的列表。

示例

List<string> ONE contains:
A
B
C

List<string> TWO contains:
B
C

我知道如果我这样做,我可以达到 ONE 的结果:

ONE.Except(TWO);

结果:一个


如果我的列表包含每个元素的文件扩展名,我该怎么做?


List<string> ONE contains:
A.pdf
B.pdf
C.pdf

List<string> TWO contains: (will always have .txt extension)
B.txt
C.txt

结果应该= A.pdf

我意识到我需要在最后的报告中显示完整的文件名(A.pdf),所以我不能像原来那样去掉扩展名。

谢谢您的帮助!

编辑:这就是我的处理方式,但我不确定这是否是实际解决它的“最佳”或“最高性能”方法,但它似乎确实有效......

foreach (string s in ONE)
{
     //since I know TWO will always be .txt
     string temp = Path.GetFileNameWithoutExtension(s) + ".txt";

     if (TWO.Contains(temp))
     {
          // yes it exists, do something
     }
     else
     {
          // no it does not exist, do something
     }
}

标签: c#liststring-comparisonpartial-matches

解决方案


您可以实现自定义相等比较器:

class FileNameComparer: IEqualityComparer<String>
{
    public bool Equals(String b1, String b2)
    {
        return Path.GetFileNameWithoutExtension(b1).Equals(Path.GetFileNameWithoutExtension(b2));
    }

    public int GetHashCode(String a)
    {
        return Path.GetFileNameWithoutExtension(a).GetHashCode();
    }
}

...并将其传递给 except 方法:

System.Console.WriteLine(string.Join(", ", list1.Except(list2, new FileNameComparer())));

推荐阅读