Лучший способ сделать поиск элемента в списке - PullRequest
1 голос
/ 17 мая 2019

Я новичок в коллекциях и linq, и мне было интересно, что может быть лучше для поиска в списке для этой части кода, которая выполняет операцию O (n), где n - это Count.Не хочу O (n), а O (1) (MapList.Find ()).

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

List<Mapp> MapList = dtResults.AsEnumerable().Select(r => new Mapp()
                {
                    Key = (int)r["Key"],
                    AlternateId = (string)r["AlternateId"],
                }).ToList();

oValueRow["Key"] = MapList.Find(x => x.AlternateId == 
Names.ElementAt(n).ToString()).Key;

Есть ли способ сделать его лучше, так как MapList может найти сделать O (1) операция, а не O (N).Я не могу сделать Elementat (n) на maplist, так как мне нужен только элемент, где x = alternateId.

1 Ответ

0 голосов
/ 17 мая 2019

Если AlternateId не гарантированно является уникальным, можно использовать Lookup (несколько значений на ключ):

var lookup = dtResults.AsEnumerable()
                      .ToLookup(r => r["AlternateId"]?.ToString() ?? "", r => (int)r["Key"]);

oValueRow["Key"] = lookup[Names.ElementAt(n).ToString()].FirstOrDefault();

Если AlternateId гарантированно будет уникальнымМожно использовать Dictionary (одно значение на ключ):

var dictionary = dtResults.AsEnumerable()
                  .ToDictionary(r => r["AlternateId"]?.ToString() ?? "", r => (int)r["Key"]);

int key;
if (dictionary.TryGetValue(Names.ElementAt(n).ToString(), out key))
    oValueRow["Key"] = key;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...