Лучший способ поиска по спискам, чем использование foreach - PullRequest
2 голосов
/ 01 декабря 2009
list vclAsset<FullAsset>
list callsigns<string>

foreach(FullAsset fa in vclAsset)
{
    if (callsigns.contains(fa.asset.callsign))
    {
         //do something
    }

}

Есть ли более элегантный способ сделать это? Объект FullAsset содержит объект Asset, который в свою очередь имеет строку «Callsign». Каждый позывной будет уникальным, поэтому в моих позывных в списке будет только одна строка, и никакие два объекта FullAsset не будут иметь общую переменную Asset.callsign.

В двух словах я хочу получить все FullAssets, которые имеют определенный позывной, но использование foreach кажется неуклюжим (учитывая, что количество FullAssets, которые могут содержаться в указанном списке, потенциально не имеет верхнего предела).

Ответы [ 6 ]

3 голосов
/ 01 декабря 2009

Вы можете использовать лямбда-выражение, что-то вроде этого:

foreach(FullAsset fa in vclAsset.Where(a => callsigns.contains(a.asset.callsign))
{
    // do something
}
3 голосов
/ 01 декабря 2009

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

Если вы хотите найти определенный элемент, вы можете использовать метод List<T>.Find и указать предикат.

FullAsset result = vclAsset.Find
     (fa => callsigns.contains(fa.asset.callsign));

или

List<FullAsset> results = vclAsset.FindAll
     (fa => callsigns.contains(fa.asset.callsign));

Если вы используете .Net 3.5, LINQ , где может быть лучшим решением, как утверждают другие, поскольку он возвращает перечислитель (ленивая оценка) против полного списка.

2 голосов
/ 01 декабря 2009

Конечно, используя linq.

var assets=    vclAsset.Where(fullA=>allsigns.contains(fullA.asset.callsign));

активы будут иметь некоторую перечислимую структуру.

Я могу порекомендовать 100 образцов Linq для вдохновения и обучения

0 голосов
/ 05 декабря 2009

Вы также можете использовать функцию Join для этого.

var sortedList = vclAsset.Join(callsigns,
    x => x.asset.callsign, x => x,
    x, y => x);

Это список vclAssets, которые имеют указанный позывной.

0 голосов
/ 01 декабря 2009
var result = vclAsset.Where(x=>callsigns.Any(y=>x.asset.callsign==y));

P.s. Я бы переименовал vclAsset и asset / callsign свойства.

0 голосов
/ 01 декабря 2009

Не уверен, что он считается более элегантным, но вы можете использовать linq ...

        var results = from fa in vclAsset
                      where callsigns.Contains(fa.asset.callsign)
                      select fa;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...