如何使用 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;
}
}
我有两个列表: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;
}
}