369 Stimmen

Zählen Sie die Elemente aus einer IEnumerable<T> ohne Iteration?

private IEnumerable<string> Tables
{
    get
    {
        yield return "Foo";
        yield return "Bar";
    }
}

Sagen wir, ich möchte diese iterieren und etwas wie die Verarbeitung von #n von #m schreiben.

Gibt es eine Möglichkeit, wie ich den Wert von m herausfinden kann, ohne vor meiner Hauptiteration zu iterieren?

Ich hoffe, ich habe mich klar ausgedrückt.

11voto

Chris Ammerman Punkte 14591

IEnumerable kann nicht zählen, ohne zu iterieren.

Unter "normalen" Umständen wäre es für Klassen, die IEnumerable oder IEnumerable<T> implementieren, wie z. B. List<T>, möglich, die Methode Count zu implementieren, indem sie die Eigenschaft List<T>.Count zurückgeben. Die Count-Methode ist jedoch keine Methode, die in der Schnittstelle IEnumerable<T> oder IEnumerable definiert ist. (Die einzige Methode, die tatsächlich definiert ist, ist GetEnumerator.) Das bedeutet, dass für sie keine klassenspezifische Implementierung bereitgestellt werden kann.

Vielmehr handelt es sich bei Count um eine Erweiterungsmethode, die für die statische Klasse Enumerable definiert wurde. Das bedeutet, dass sie auf jeder Instanz einer von IEnumerable<T> abgeleiteten Klasse aufgerufen werden kann, unabhängig von der Implementierung dieser Klasse. Aber es bedeutet auch, dass sie an einer einzigen Stelle implementiert ist, außerhalb jeder dieser Klassen. Das bedeutet natürlich, dass sie auf eine Weise implementiert werden muss, die völlig unabhängig von den Interna dieser Klassen ist. Die einzige Möglichkeit, die Zählung durchzuführen, ist die Iteration.

10voto

JesperE Punkte 61161

Nein, nicht im Allgemeinen. Ein Punkt bei der Verwendung von Aufzählungen ist, dass die tatsächliche Menge der Objekte in der Aufzählung nicht bekannt ist (im Voraus oder überhaupt).

8voto

Sowvik Roy Punkte 815

Ich denke, der einfachste Weg, dies zu tun, ist

Enumerable.Count<TSource>(IEnumerable<TSource> source)

Referenz: system.linq.enumerable

8voto

prosseek Punkte 167667

Sie können mit System.Linq.

using System;
using System.Collections.Generic;
using System.Linq;

public class Test
{
    private IEnumerable<string> Tables
    {
        get {
             yield return "Foo";
             yield return "Bar";
         }
    }

    static void Main()
    {
        var x = new Test();
        Console.WriteLine(x.Tables.Count());
    }
}

Sie erhalten das Ergebnis '2'.

6voto

Shahidul Haque Punkte 99

Ich habe diesen Weg innerhalb einer Methode verwendet, um die übergebene IEnumberable Inhalt

if( iEnum.Cast<Object>().Count() > 0) 
{

}

Innerhalb einer Methode wie dieser:

GetDataTable(IEnumberable iEnum)
{  
    if (iEnum != null && iEnum.Cast<Object>().Count() > 0) //--- proceed further

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X