【问题标题】:Best way to do search of an item in list在列表中搜索项目的最佳方法
【发布时间】:2019-05-17 18:02:10
【问题描述】:

我是集合和 linq 的新手,想知道在列表中搜索执行 O(n) 操作的这部分代码的更好方法是什么,其中 n 是计数。不想要 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 = alternateId 的元素。

【问题讨论】:

    标签: list linq


    【解决方案1】:

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

    【讨论】:

    • 感谢 Slai,实际上 Key 是唯一的,alternateId 可以是唯一的,但它也可以有空值。我正在尝试做这样的事情,但无法让 if 代码正常工作。 var dictionary = dtResults.AsEnumerable() .ToDictionary(r =>(int)r["Key"], r => (string)r["alternateId"]);我需要基于提供的 alternateId 的 Key 值。整数键; if (dictionary.TryGetValue(stInfo.name, out Key)
    • @Sarah 用于搜索 (alternateId) 的值应该是第一个,如我的示例中所示。如果您无法弄清楚第二个示例,请尝试第一个示例。
    • 感谢您对此的帮助。是的,我尝试将alternateId 作为第一个参数,但是因为dtresults 在alternateId 字段中可以有空值,所以它不喜欢它。我怎样才能只从 dtResults 中挑选不为空的记录,然后我可以做你推荐的事情。
    猜你喜欢
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多