2010-12-14 7 views
0

Ich habe drei Sätze Listboxen, ich verschiebe Elemente von lb1 zu lb2, von lb3 zu lb4 und von lb5 zu lb6. Die Listenfelder auf der linken Seite enthalten die gleichen Elemente und ich möchte nicht, dass der Benutzer die Seite senden kann, wenn ein oder mehrere Elemente aus den linken Listenfeldern zu mehr als einem Listenfeld auf der rechten Seite hinzugefügt werden. Zum Beispiel kann Element A in lb1, lb3 und lb5 nur in lb2, lb4 oder lb6 gespeichert werden, nicht in zwei oder drei von ihnen.Wie überprüft man, ob ein Element in mehr als einer Listbox existiert? ASP.NET/C#

Ich möchte diese Prüfung vor dem Einreichen der Seite durchführen (und später werde ich Validierung mit Javascript hinzufügen) und ich frage mich, was ist der effizienteste Weg, dies zu tun.

Fügen Sie alle Elemente zu einer Liste hinzu und prüfen Sie, ob Dubletten vorhanden sind.

Vielen Dank im Voraus.

Edit: etwas wie folgt aus:

  List<string> groupList = new List<string>(); 
      foreach (ListItem item in lbFullAccess.Items) 
      { 
       groupList.Add(item.Value.ToString()); 
      } 
      foreach (ListItem item in lbContributor.Items) 
      { 
       groupList.Add(item.Value.ToString()); 
      } 
      foreach (ListItem item in lblReadOnly.Items) 
      { 
       groupList.Add(item.Value.ToString()); 
      } 
+0

Warum einfach nicht über die Listboxen iterieren und überprüfen? Wie wäre es mit DISTINCT für jedes Listenfeld beim Absenden? – Ostap

Antwort

0

Nun, es gibt hundert verschiedene Möglichkeiten, wie Sie es tun könnte. Absolut nichts falsch mit Ihrem Vorschlag der Iteration.

Sie könnten ein wenig Spaß mit LINQ haben:

public bool AreAllValuesUnique() 
{ 
    // Build up a linq expression of all of the ListItems 
    // by concatenating each sequence 
    var allItems = lbFullAccess.Items.Cast<ListItem>() 
     .Concat(lbContributor.Items.Cast<ListItem>()) 
     .Concat(lbReadOnly.Items.Cast<ListItem>()); 

    // Group the previous linq expression by value (so they will be in groups of "A", "B", etc) 
    var groupedByValue = allItems.GroupBy(i => i.Value); 

    // Finally, return that all groups must have a count of only one element 
    // So each value can only appear once 
    return groupedByValue.All(g => g.Count() == 1); 
} 

Nicht wirklich sicher über die Leistung der Cast aufrufen (jedes Element des ListItemCollection zu einer ListItem Umwandlung, was zu einer IEnumerable) auf jeder Sammlung, aber es ist wahrscheinlich vernachlässigbar.

Verwandte Themen