2014-11-18 10 views
7

Ich habe den folgenden Code:kann nicht implizit Typ ‚int‘ auf ‚System.Collections.Generic.List <QuickTest.Stock>‘ konvertieren

static void Main(string[] args) 
    { 
     List<Stock> ticker = new List<Stock>(); 
     ticker.Add(new Stock("msft")); 
     ticker.Add(new Stock("acw")); 
     ticker.Add(new Stock("gm")); 

     ticker = ticker.OrderBy(s => s.Name).ToList(); 

     foreach (Stock s in ticker) 
     { 
      Console.WriteLine(s.Name); 
     } 

     Console.WriteLine("\n"); 
     ticker = ticker.RemoveAll(s => s.TickerSymbol == "gm"); 

     foreach (Stock s in ticker) 
     { 
      Console.WriteLine(s.Name); 
     } 
    } 

Auf ein Objekt, das String-Eigenschaften und Tickersymbol Namen hat. Es hat auch doppelte Eigenschaften Price, ChangeDollars und ChangePercent.

Die zweite LINQ-Anweisung, die ich geschrieben habe, wirft einen Fehler mit der Nachricht, "kann Typ 'int' nicht implizit in 'System.Collections.Generic.List' konvertieren". Ich bin verwirrt, woher der Typ 'int' kommt und wie man diesen Fehler beheben kann, da ich keine int-Werte irgendwo im Programm verwende.

Ich bin auch sehr neu zu LINQ, das ist mein erstes Mal mit es. Dieser Fehler könnte sehr wohl eine Folge von LINQ sein, die ich nicht kenne.

Wer weiß, warum dieser Fehler passiert und wie es zu beheben?

+1

'RemoveAll' wird keine neue Liste zurückgeben, es wird die vorhandene Liste ändern und die Anzahl der entfernten Datensätze zurückgeben. – Habib

+0

Ihre zweite LINQ-Anweisung ist überhaupt keine LINQ-Anweisung. Alles, was es tut, ist 'RemoveAll' auf der Liste zu nennen – dcastro

+0

@dcastro Ist es nicht eine Inline-LINQ-Anweisung? – mstagg

Antwort

11

Es ist vernünftig, den Fehler zu erhalten, weil RemoveAll die Anzahl der entfernten Bestände zurückgibt. Dies ist eine ganze Zahl. Dann versuchen Sie, dies der Variablen ticker zuzuordnen, die eine Liste von Objekten des Typs Stock enthält.

Das ist wahrscheinlich, dass Sie alle Aktien, die ihre TickerSymbolgm ist entfernen möchten und dann schreiben Sie die Aktien, die sie in Ticker auf der Konsole verlassen wurden. Um dies zu tun, können Sie nur diese versuchen:

// This will remove all the stocks you want. 
ticker.RemoveAll(s => s.TickerSymbol == "gm"); 

foreach (Stock s in ticker) 
{ 
    Console.WriteLine(s.Name); 
} 

Weiterhin für die Aufzeichnung, wie es in MSDN heißt:

Die Methode List<T>.RemoveAll()

alle Elemente entfernt, die die Bedingungen erfüllen, die durch das spezifizierte Prädikat definiert sind.

Es Unterschrift ist die folgende:

public int RemoveAll(Predicate<T> match) 

Der Predicate<T> ist ein an eine Methode, die true zurückgibt, wenn das übergebene Objekt die Bedingungen passt in den Delegaten definiert. Die Elemente der aktuellen Liste werden einzeln an den Prädikatdelegaten übergeben, und die Elemente, die den Bedingungen entsprechen, werden aus der Liste entfernt.

Diese Methode führt eine lineare Suche aus; Daher ist diese Methode eine O (n) -Operation, wobei n die Count-Eigenschaft von List ist.

+0

Ah, danke.Ich weiß nicht, wie ich das übersehen habe. Gibt es einen Hinweis darauf, wie eine neue Instanz der Liste zurückgegeben wird, wenn das angegebene Objekt entfernt wurde? – mstagg

+0

@mstagg Sie begrüßen Kumpel! Ich bin froh, dass ich geholfen habe. Sie könnten einfach den 'Ticker' zurückgeben, nachdem Sie' RemoveAll' aufgerufen haben. Letzteres wird alle Elemente entfernt haben, die Sie nicht wollten. – Christos

+0

Das hat es getan. Vielen Dank! +1 – mstagg

Verwandte Themen