"Möglich, mehrere enumeration von IEnumerable" vs "- Parameter können deklariert werden, mit dem Basistyp"

In Resharper 5, der folgenden code-led zur Warnung "Parameter deklariert werden können mit dem Basis-Typ" für list:

public void DoSomething(List<string> list)
{
    if (list.Any())
    {
        //...
    }
    foreach (var item in list)
    {
        //...
    }
}

In Resharper 6, dies ist nicht der Fall. Allerdings, wenn ich die Methode ändern, um die folgenden, noch bekomme ich diese Warnung:

public void DoSomething(List<string> list)
{
    foreach (var item in list)
    {
        //...
    }
}

Der Grund dafür ist, dass in dieser version, ist nur einmal aufgezählt, so ändern Sie ihn auf IEnumerable<string> wird nicht automatisch einführen, eine weitere Warnung.
Nun, wenn ich die erste version manuell zu verwenden IEnumerable<string> statt einer List<string>, ich werde diese Warnung ("mehrere Mögliche Aufzählung von IEnumerable") auf beide vorkommen von list im Körper der Methode:

public void DoSomething(IEnumerable<string> list)
{
    if (list.Any()) //<- here
    {
        //...
    }
    foreach (var item in list) //<- and here
    {
        //...
    }
}

Verstehe ich, warum, aber ich Frage mich, wie man dieses Problem lösen Warnung, vorausgesetzt, dass die Methode wirklich nur braucht ein IEnumerable<T> und nicht ein List<T>denn ich will einfach nur zum aufzählen der Elemente und ich will nicht, um die Liste zu ändern.

Hinzufügen eines list = list.ToList(); am Anfang der Methode ist die Warnung Weg gehen:

public void DoSomething(IEnumerable<string> list)
{
    list = list.ToList();
    if (list.Any())
    {
        //...
    }
    foreach (var item in list)
    {
        //...
    }
}

Ich verstehe, warum, macht die Warnung geht Weg, aber es sieht ein bisschen aus wie ein hack zu mir...

Irgendwelche Vorschläge, wie zu lösen, die Warnung besser und noch verwenden die meisten allgemein Typ möglich in der Signatur der Methode?

Die folgenden Probleme sollten alle gelöst werden, für eine gute Lösung:

  1. Kein Aufruf ToList() innerhalb der Methode, weil es eine Auswirkung auf die Leistung
  2. Keine Verwendung von ICollection<T> oder sogar mehr spezialisierte Schnittstellen/Klassen, da Sie die Semantik der Methode, aus Sicht der Anrufer.
  3. Keine mehrfache Iterationen über eine IEnumerable<T> und damit zu riskieren, Zugriff auf eine Datenbank mehrere Male oder ähnliches.

Hinweis: ich bin mir bewusst, dass dies nicht eine Resharper Problem, und dadurch, dass ich nicht wollen, um diese Warnung zu unterdrücken, sondern beheben Sie die zugrunde liegende Ursache, wie die Warnung legitim ist.

UPDATE:
Bitte don ' T care about Any und die foreach. Ich brauche nicht zu helfen in der Zusammenführung dieser Aussagen haben nur eine Aufzählung der enumerable.

Es könnte wirklich alles sein, was in dieser Methode zählt die enumerable-mehrfach!

InformationsquelleAutor der Frage Daniel Hilgarth | 2011-07-20

Schreibe einen Kommentar