Самый быстрый способ поиска во вложенном списке <> в C # - PullRequest
5 голосов
/ 09 июля 2011

У меня есть список <>, который содержит другой список <>

Мне нужно выяснить, присутствует ли данное значение в каком-либо из элементов в самом внутреннем списке. Если совпадение найдено, мне нужен этот конкретный предмет и я возвращаюсь.

Я делаю это, как показано ниже:

InnerList inner = null;
foreach(TopList in topListItems)
{
    inner = asn.Owners.Find(x => x.GuestId == guestId);
    if(inner != null)
         break;
}

//item found if inner is not null
//else item absent in the inner list

Any other alternate way that may run faster than this?

EDIT: Некоторое исправление: мне просто нужно посмотреть, есть ли во внутреннем списке элемент с определенным значением. Если да, то мне нужно вернуть элемент верхнего уровня, который соответствует. Я думаю, логика та же.

Ответы [ 4 ]

7 голосов
/ 09 июля 2011

Это было бы, как я достиг бы этого, используя Linq.

var answer = from topList in TopListItems
             from innerListItem in topList.InnerList
             where innerListItem.GuestId == guestId
             select topList;

или используя Lambdas согласно комментарию Claytons

var answer = TopListItems.FirstOrDefault(topList => 
             topList.InnerList.Any(innerList => 
             innerList.GuestId == guestId));

Однако рефакторинг для использования словаря с ключами с использованием GuestIdбыстрее.

4 голосов
/ 09 июля 2011

Если вы хотите сохранить структуру данных, то единственное улучшение, которое я вижу, это исключение поиска и поиска на основе делегатов вручную.Я ожидаю улучшения примерно в два раза.

foreach(var innerList in outerList)
{
    foreach(var item in innerList)
    {
        if(item.GuestId == guestId)
            return innerList;
    }
}
return null;

Если возможно, вы можете каким-то образом использовать словари.Но я не знаю достаточно о вашей проблеме, чтобы сказать вам, если это возможно.Это может дать действительно большое ускорение, поскольку поиск по ключу в словаре - это O (1), а не просто O (n).

В некоторых ситуациях цикл for может дать небольшое ускорение по сравнению с foreach, но я не знаю, один из них.Так что вам нужно будет тестировать.

1 голос
/ 09 июля 2011

Вы можете сделать это рекурсивно. Этот код, вероятно, не будет работать для вас, но он будет примерно таким:

public object loopList(List<object> dList,object searchvalue)
{
    foreach(object value in dList)
    {
      if(searchvalue == value)
      {
        return value;
      }
      else
      {
         loopList((List<object>)value);
       }
    }
}
0 голосов
/ 09 июля 2011

Внутренний список отсортирован? Если это так, вы можете использовать бинарный поиск для внутреннего списка, который обеспечит потенциальное улучшение производительности. Кроме того, если у вас есть контроль над конструкцией внутреннего списка, изменение его на словарь с ключом в GuestId даст вам более оптимальную проверку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...