Как я могу построить ручную версию этого? - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть класс с именем Package, который содержит List<string> и string членов, соответствующих списку зависимостей и имени пакета. Он переопределяет Equals(), обеспечивая равенство на основе имени Package. Я пытаюсь построить ручную версию этой строки:

Uninstallable.RemoveAll(pkg => Installable.Contains(pkg));

, где Uninstallable и Installable List<Package>.

Моя попыткаContains() method:

public static bool MyContains(this List<Package> packages, Package inPkg)
{
    foreach (Package pkg in packages)
    {
        if (pkg.Equals(inPkg))
        {
            return true;
        }
    }

    return false;
}

Как я могу использовать этот метод расширения для создания той же функциональности, что и вышеприведенная строка, но без лямбды?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2019

Вы можете использовать этот цикл foreach:

foreach ( var item in Uninstallable.ToList() )
  if ( Installable.MyContains(item ) )
    Uninstallable.Remove(item)

Нам нужно вызвать ToList, потому что мы модифицируем Uninstallable.

В противном случае вы можете использовать цикл for:

for ( int index = Uninstallable.Count - 1; index >= 0; index-- )
  if ( Installable.MyContains(Uninstallable[index]) )
    Uninstallable.RemoveAt(index);

Так как мы убираем предметы, проблем нет.

0 голосов
/ 04 ноября 2019

Это пример того, как вы можете упростить ваше расширение.

public static bool MyContains(this List<Package> packages, Package inPkg)
{
    return packages.Any(x => x.Equals(inPkg));
}
...