Сравните 2 списка для частичного соответствия - PullRequest
0 голосов
/ 20 февраля 2019

C # Folks! У меня есть 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 голосов
/ 20 февраля 2019

Вы можете реализовать пользовательский компаратор равенства:

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())));
0 голосов
/ 20 февраля 2019

Это очень простой и простой код, но если ваше требование имеет расширение файла

    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);
            }
        }
...