我是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的元素。
答案 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;