2014-11-18 13 views
7

ho il seguente codice:Impossibile convertire implicitamente il tipo 'int' a 'System.Collections.Generic.List <QuickTest.Stock>'

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

azionario è un oggetto che ha le proprietà di stringa tickerSymbol e il nome. Ha anche proprietà doppie Price, ChangeDollars e ChangePercent.

La seconda istruzione LINQ che ho scritto genera un errore con il messaggio "Impossibile convertire implicitamente il tipo 'int' in 'System.Collections.Generic.List'". Sono confuso da dove proviene il tipo 'int' e come correggere questo errore, in quanto non uso alcun valore int in nessun punto del programma.

Sono molto nuovo anche a LINQ, questa è la mia prima volta che lo uso. Questo errore potrebbe benissimo essere il risultato di qualche intreccio di LINQ di cui non sono a conoscenza.

Qualcuno sa perché questo errore si sta verificando e come risolverlo?

+1

'RemoveAll' non restituirà un nuovo elenco, modificherà l'elenco esistente e restituirà il numero di record rimossi. – Habib

+0

La tua seconda istruzione LINQ non è affatto un'istruzione LINQ. Tutto ciò che fa è chiamare 'RemoveAll' nell'elenco – dcastro

+0

@dcastro Non è una dichiarazione LINQ in linea? – mstagg

risposta

11

È ragionevole l'errore, perché RemoveAll restituisce il numero di scorte rimosse. Questo è un numero intero. Quindi si tenta di assegnarlo alla variabile denominata ticker, che contiene un elenco di oggetti di tipo Stock.

Che probabilmente si desidera rimuovere tutti gli stock che il loro TickerSymbol è gm e quindi scrivere gli stock che sono stati lasciati in ticker alla console. Per farlo, si può solo provare questo:

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

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

Inoltre, per la cronaca, come si afferma in MSDN:

Il metodo List<T>.RemoveAll()

Rimuove tutti gli elementi che corrisponde alle condizioni definite dal predicato specificato .

firma di E è la seguente:

public int RemoveAll(Predicate<T> match) 

Il Predicate<T> è un delegato a un metodo che restituisce true se l'oggetto passato ad esso corrisponde alle condizioni definite nel delegato. Gli elementi dell'elenco corrente vengono passati singolarmente al delegato Predicato, e gli elementi che corrispondono alle condizioni vengono rimossi dall'elenco.

Questo metodo esegue una ricerca lineare; pertanto, questo metodo è un'operazione O (n) , dove n è la proprietà Conteggio dell'elenco.

+0

Ah, grazie.Non so come ho trascurato questo. qualche suggerimento su come restituire una nuova istanza della lista con l'oggetto specificato rimosso? – mstagg

+0

@mstagg Benvenuto amico! Sono contento di aver aiutato. Si potrebbe semplicemente restituire il 'ticker', dopo aver chiamato' RemoveAll'. Quest'ultimo avrà rimosso tutti gli elementi che non volevi. – Christos

+0

Questo l'ha fatto. Grazie! +1 – mstagg

Problemi correlati