如何使用 LINQ 或 Lambda 将字典中的过滤值列表放入列表中?

How to get a list of filtered values in Dictionary into a List using LINQ or Lambda?

我有两个列表:ListA 和 ListB 以及字典 DictA。

我正在检查 ListA 的所有值,我想 return 将 DictA 的 "Value" 放入 ListB。

目前我是这样操作的:

ListA = ...
foreach(var x in ListA) {
    if(DictA.ContainsKey(x))
    {
         ListB.add(DictA[x]);
    }
}

如何在 Lambda 或 LINQ 中执行此操作?

您可以这样做(非常直接地翻译您的代码):

ListB.AddRange(ListA.Where(t => DictA.ContainsKey(t)).Select(t => DictA[t]));

如果您确定字典中存在所有 ListA 值,则可以删除 .Where(..) 并仅保留 .Select(..).

如果 ListB 只包含这些值,那么您可以稍微重新安排一下:

var ListB = ListA.Where(t => DictA.ContainsKey(t)).Select(t => DictA[t]).ToList();

替代方法(可能更快):

var ListB = ListA.Intersect(DictA.Keys).Select(t => DictA[t]).ToList();

首先,如果您没有使用 TryGetValue,那么您将进行两次对象搜索,首先是 ContainsKey,然后是检索对象。以最佳性能来说,应该是这样的。

 var ListB = ListA.Select<TypeA>( x=> { 
              TypeA a = null; 
              DictA.TryGetValue(x, out a);
              return a; }).Where( x=> x != null).ToList();

在上述情况下,您只枚举列表一次,并且也只检索一次项目。

您可以编写如下扩展方法来重用它,

public static IEnumerable<TValue> ToFilteredValues<TKey,TValue>(
        this IDictionary<TKey,TValue> dict, 
             IEnumerable<TKey> list){
     TValue value;
     foreach(var key in list){
        if(dict.TryGetValue(key, out value))
           yield return value;
     }
}