比较2个部分匹配的列表

时间:2019-02-20 14:12:09

标签: c# list string-comparison partial-matches

C#朋友!我有2个要比较的列表。

示例

List<string> ONE contains:
A
B
C

List<string> TWO contains:
B
C

我知道只要我能达到“一”的结果:

ONE.Except(TWO);

结果:A


  

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


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
     }
}

2 个答案:

答案 0 :(得分:1)

这是一个非常简单明了的代码,但是如果您的要求具有更多文件扩展名

    List<string> lstA = new List<string>() { "A.pdf", "B.pdf", "C.pdf" };

        List<string> lstB = new List<string>() { "B.txt", "C.txt" };

        foreach (var item in lstA)
        {
            if (lstB.Contains(item.Replace(".pdf",".txt"))==false)
            {
                Console.WriteLine(item);
            }
        }

答案 1 :(得分:1)

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

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())));