2009-05-13 9 views
2

Ich zeige den Inhalt einer Tabelle in der Datenbank mithilfe einer ListBox an. Jedes Listbox-Element wird mit der Text-Eigenschaft gefüllt, die auf einen angezeigten Namen und die Value-Eigenschaft auf die eindeutige ID-Spalte festgelegt ist. Die Datenbankstruktur aussehen könnte, ähnlich der folgenden:Verwenden von Linq zum Konvertieren von ListBox-Elementen Werte in int

CREATE TABLE GENERIC { FRIENDLY_NAME TEXT, ID INT } 

Ich habe versucht, für fast eine Stunde, um die Elemente der Listbox in einen int [] mithilfe von LINQ und letztlich nicht zu konvertieren. Es ist auch wichtig, zwischen den ausgewählten und nicht ausgewählten Elementen zu unterscheiden. Hier ist, was ich am Ende schrieb:

System.Collections.Generic.LinkedList<int> 
      selected = new LinkedList<int>(), 
      notSelected = new LinkedList<int>(); 

     foreach (ListItem item in PhotoGalleryEdit_PhotoShoots.Items) 
     { 
      if (item.Selected) 
       selected.AddFirst(Convert.ToInt32(item.Value)); 
      else 
       notSelected.AddFirst(Convert.ToInt32(item.Value)); 
     } 

int []arraySelected = selected.ToArray(); 
int []arrayNotSelected = notSelected.ToArray(); 

Kann jemand zeigen, wie dies in LINQ getan wird?

(Ich schreibe alle meine Code in C#, aber keine Antworten in VB geschrieben wäre mehr als willkommen sein)

Antwort

6

Aus Ihrer Beschreibung, die am wenigsten unordentlich ich mit oben kommen kann ist:

var qry = from ListItem item in listbox.Items 
      select new {item.Selected, Value = Convert.ToInt32(item.Value)}; 

int[] arrSelected=qry.Where(x=>x.Selected).Select(x=>x.Value).ToArray(); 
int[] arrNotSelected=qry.Where(x=>!x.Selected).Select(x => x.Value).ToArray(); 

Da Sie addFirst verwenden, können Sie auch brauche irgendwo einen .Reverse() - oder benutze danach Array.Reverse().

+0

Das funktioniert bei mir und ist sehr sauber. – hannasm

0
int[] selected = (from item in PhotoGalleryEdit_PhotoShoots.SelectedItems.OfType<MyItem>() select item.Value).ToArray(); 

Edit: Hinzugefügt OfType rufen Elemente IEnumerable erhalten ausgewählt.

bearbeiten II: Für die nicht ausgewählten Elemente:

int[] notSelected = (from item in PhotoGalleryEdit_PhotoShoots.Items.OfType<MyItem>() where !Array.Exists(selected, x => x == item.Value) select item.Value).ToArray(); 
+0

SelectedItems würde eine Guss () oder ähnliches erfordern (es ist nicht IEnumerable ist) - und Sie haben die Convert.ToInt32 –

+0

ich mit einem IList getestet anstelle eines IList fallen gelassen, die Sie richtig darauf hingewiesen haben, ist das, was SelectedItems gibt zurück. Zum Glück gibt es eine schöne OfType-Methode für die SelectedItems, die ein IEnumerable-Objekt zurückgibt, was es zu einer netten Ein-Zeilen-Lösung macht. – sipwiz

Verwandte Themen