c # folks! Mam 2 listę, którą chcę porównać.

Przykład :

List<string> ONE contains:
A
B
C

List<string> TWO contains:
B
C

Wiem, że mogę osiągnąć wyniki jednego, jeśli zrobię:

ONE.Except(TWO);

wyniki : a


Jak mogę zrobić to samo, jeśli moje listy zawierają rozszerzenie pliku dla każdego elementu?


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

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

Wyniki powinny = a.pdf

Zdałem sobie sprawę, że muszę wyświetlić pełną nazwę pliku (A.PDF) w raporcie na końcu, więc nie mogę usunąć rozszerzenia, jak pierwotnie.

dzięki za pomoc!

Edytuj : W ten sposób poszedłem na to, ale nie jestem pewien, czy jest to "najlepszy" lub "najbardziej występujący" sposób, aby faktycznie rozwiązać, ale wydaje się, że działa ...

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
     }
}
0
Jayarikahs 20 luty 2019, 17:12

2 odpowiedzi

Najlepsza odpowiedź

To bardzo prosty i łatwy kod, ale jeśli wymaganie ma więcej rozszerzenia pliku

    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
DinGov89 20 luty 2019, 15:45

Możesz zaimplementować niestandardowe porównanie równości:

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

... i przekazać go z wyjątkiem metody:

System.Console.WriteLine(string.Join(", ", list1.Except(list2, new FileNameComparer())));
1
Thiago Barcala 20 luty 2019, 15:46