2010-12-14 3 views
0

У меня есть три набора списков, я перемещаю элементы от lb1 до lb2, от lb3 до lb4 и от lb5 до lb6. В списках слева содержатся те же элементы, и я не хочу, чтобы пользователь мог отправлять страницу, если один или несколько элементов из левых списков добавлены в более чем один список справа. Например, элемент A в lb1, lb3 и lb5 может быть сохранен только в lb2, lb4 или lb6, а не в двух или трех из них.Как проверить, существует ли элемент в нескольких списках? ASP.NET/C#

Я хочу выполнить эту проверку перед отправкой страницы (и позже я добавлю подтверждение с помощью javascript), и мне интересно, что является самым эффективным способом сделать это.

Добавить все элементы в список и проверить, есть ли дубликаты?

Заранее спасибо.

Edit: что-то вроде этого:

  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

Почему просто не перебирать списки и не проверять? Как насчет использования DISTINCT для каждого окна списка при отправке? – Ostap

ответ

0

Ну, есть сотни различных способов, которыми Вы могли бы это сделать. Абсолютно ничего плохого в вашем предложении итерации.

Вы могли бы немного развлечься с помощью LINQ:

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

Не совсем уверен, о выполнении вызова Cast (преобразование каждого элемента ListItemCollection к ListItem, в результате IEnumerable) на каждой коллекции, но это, вероятно, незначительно.

Смежные вопросы