2013-02-01 30 views
7

Questa domanda è stata probabilmente risolta centinaia di volte, ma qui va.Impossibile convertire implicitamente il tipo 'stringa' in 'System.Collections.Generic.List <string>'

Ho questo chunck di codice:

private void PopulateStringDropdownList(List<ObjectInfo> listObject, 
             object selectedType = null) 
{ 
    List<string> listString = listObject.OrderBy(x => x.m_Type).ToString(); 
    for (int i = 0; i < listString .Count; i++) 
    { 
     for (int j = i + 1; j < listString .Count; j++) 
     { 
      if (String.Equals(listString [i], listString [j])) 
      { 
       listString.RemoveAt(j); 
      } 
     } 
    } 
    ViewBag.property1 = new SelectList(listString); 
} 

Quindi, fondamentalmente sto cercando di compilare un elenco a discesa con le stringhe provenienti da una proprietà di ogni oggetti contenuti nella lista mi passa nel parametro.

Ma il codice non viene compilato a causa dell'errore che si sta vedendo lassù, e devo ancora capire perché esattamente. Qualche aiuto a qualcuno?

+1

Quale linea sta fallendo? (E per favore prenditi il ​​tempo di formattare il tuo codice tu stesso per i futuri contenuti.) –

+3

Usa ToList() invece di ToString(). –

+0

_listString_ non viene mai utilizzato. E stai cercando di rimuovere le stringhe duplicate in _listObject_? –

risposta

11

Questa è la linea problematica:

List<string> listString = listObject.OrderBy(x => x.m_Type).ToString(); 

ToString restituisce una stringa, e si sta tentando di assegnare ad una variabile List<string>.

Hai bisogno di fare qualcosa di simile:

List<string> listString = listObject.OrderBy(x => x.m_Type) 
            .Select(x => x.ToString()) 
            .ToList(); 

Questa dichiarazione sarà ordinare il listObject enumerabile all'ordine che vostro voglia, quindi convertire i valori in stringhe, e, infine, convertire il enumerabile ad un List<string>.

+0

Funziona perfettamente. Grazie! – hsim

2

Penso che tu voglia ToList invece di ToString.

Inoltre, se tutti si sta cercando di fare è rimuovere i duplicati, si può semplicemente utilizzare LINQ e fare questo:

List<string> listString = listObject.OrderBy(x => x.m_Type). 
    Select(x => x.ToString()).Distinct().ToList(); 
+0

Oh! Proveremo anche quello. – hsim

+0

listObject è un elenco di ObjectInfo, non di stringa, quindi utilizzare listObject.OrderBy (x => x.m_Type) .Select (l => l.ToString()). Distinct(). ToList() – AndyClaw

+0

@AndyClaw Grazie Andy. Penso che stavo modificando la mia risposta proprio come hai commentato. –

5

Guardate questo codice:

List<string> listString = listObject.OrderBy(x => x.m_Type).ToString(); 

Il lato destro espressione sta chiamando ToString() sul risultato di OrderBy - che non è di per sé utile e si tradurrà in un string.

Si sta quindi tentando di assegnare quell'espressione string a una nuova variabile di tipo List<string>. Non funzionerà.

ho sospetto si desidera solo ToList invece di ToString:

List<string> listString = listObject.OrderBy(x => x.m_Type).ToList(); 
+0

Non è che non voglio; piuttosto, non funziona. Ho pensato prima che fosse perché la lista che riceve i dati era una lista di stringhe, ma ... no. – hsim

+0

@ HervéSimard: cosa intendi? Cosa non è successo quando hai provato questo? Qual è il tipo di campo 'm_Type'? (Si prega di essere più specifico in futuro.) –

2

È possibile semplificare tutto il codice in:

List<string> listString = listObject.OrderBy(x => x.m_Type) 
            .Select(x => x.ToString()) 
            .Distinct() // Remove duplicated entries 
            .ToList(); 
ViewBag.property1 = new SelectList(listString); 
+0

Il mio codice ora appare esattamente come questo :) Grazie! – hsim

+0

+1 ti sei meritato i punti, non OP. –

1

c'era ancora un po 'di correzione da fare. Ecco il codice completo:

private void PopulateStringDropdownList(List<ObjectInfo> listObjects, object selectedType = null) 

     { 
      List<string> listString = listObjects.OrderBy(x => x.m_Type) 
              .Select(x => x.m_Type.ToString()) 
              //.Distinct() 
              .ToList(); 
      ViewBag.cardType = new SelectList(listString); 
     } 

In questo modo il valore corretto trovato è la stringa del tipo e non il tipo di oggetto.

Grazie a tutti per il vostro aiuto!

1

lista Convert del int alla lista di string:

List<string> listString = listObject.OrderBy(x => x.m_Type). 
Select(x =>x.ToString()).ToList(); 
Problemi correlati