搜索列表中项目的最佳方法

时间:2019-05-17 18:02:11

标签: list linq

我是collections和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)。我无法在maplist上执行Elementat(n),因为我只需要x = AlternativeId的元素。

1 个答案:

答案 0 :(得分:0)

如果不能保证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;