C# 有没有办法在字典内容上使用.ForEach?
我将一个集合从C# 有没有办法在字典内容上使用.ForEach?,c#,.net,C#,.net,我将一个集合从List更改为Dictionary,似乎我需要在其上使用.ForEach()更改为ForEach()——无论我是在迭代字典本身还是Dictionary.Values 这没什么大不了的,但我已经看到过好几次当你可以和不能使用LINQ的时候会有细微的差异,我想知道是否有办法,但我错过了它?不幸的是。ForEach()只在列表中定义 您可以先使用.ToList()来访问.ForEach,但与仅使用ForEach相比,这当然会降低性能,或者您可以为此创建扩展方法: public stati
List
更改为Dictionary
,似乎我需要在其上使用.ForEach()
更改为ForEach()
——无论我是在迭代字典本身还是Dictionary.Values
这没什么大不了的,但我已经看到过好几次当你可以和不能使用LINQ的时候会有细微的差异,我想知道是否有办法,但我错过了它?不幸的是
。ForEach()
只在列表中定义
您可以先使用.ToList()
来访问.ForEach
,但与仅使用ForEach
相比,这当然会降低性能,或者您可以为此创建扩展方法:
public static void ForEach<T, U>(this Dictionary<T, U> d, Action<KeyValuePair<T, U>> a)
{
foreach (KeyValuePair<T, U> p in d) { a(p); }
}
public static void ForEach<T, U>(this Dictionary<T, U>.KeyCollection k, Action<T> a)
{
foreach (T t in k) { a(t); }
}
public static void ForEach<T, U>(this Dictionary<T, U>.ValueCollection v, Action<U> a)
{
foreach (U u in v) { a(u); }
}
publicstaticvoidforeach(此字典d,动作a)
{
foreach(KeyValuePair p in d){a(p);}
}
公共静态void ForEach(此Dictionary.KeyCollection k,操作a)
{
foreach(T在k中){a(T);}
}
公共静态void ForEach(此Dictionary.ValueCollection v,操作a)
{
foreach(U在v中){a(U);}
}
如果您对进一步的信息感兴趣,那么已经有一个类似的例子了 不幸的是,.ForEach()
仅在列表
类中定义
您可以先使用.ToList()
来访问.ForEach
,但与仅使用ForEach
相比,这当然会降低性能,或者您可以为此创建扩展方法:
public static void ForEach<T, U>(this Dictionary<T, U> d, Action<KeyValuePair<T, U>> a)
{
foreach (KeyValuePair<T, U> p in d) { a(p); }
}
public static void ForEach<T, U>(this Dictionary<T, U>.KeyCollection k, Action<T> a)
{
foreach (T t in k) { a(t); }
}
public static void ForEach<T, U>(this Dictionary<T, U>.ValueCollection v, Action<U> a)
{
foreach (U u in v) { a(u); }
}
publicstaticvoidforeach(此字典d,动作a)
{
foreach(KeyValuePair p in d){a(p);}
}
公共静态void ForEach(此Dictionary.KeyCollection k,操作a)
{
foreach(T在k中){a(T);}
}
公共静态void ForEach(此Dictionary.ValueCollection v,操作a)
{
foreach(U在v中){a(U);}
}
如果您对进一步的信息感兴趣,那么已经有一个类似的例子了 字典是可枚举的,所以你所要做的就是dict.Select()或dict.Where()。ForEach
实际上是一个列表
而不是IEnumerable
,所以为什么它不适用于字典
而不适用于Linq。这里还有一个问题:是的,我想知道值
是什么。。。我认为这可能最终是一个列表
,但显然不是。我想知道是否有一个很好的技术原因,或者仅仅“因为”?@Mr.Boy LINQ是一种声明性方法,它不修改源集合,而是以一种懒惰的方式过滤/映射。ForEach有点相反。。。事实上,Select(x=>action(x)).All()
大致相当于.ForEach
,但这确实令人困惑,如果您需要非惰性执行,常规的ForEach
将更加自我记录。字典是可枚举的,所以您只需执行dict.Select()或dict.Where().ForEach
实际上是一个列表
而不是IEnumerable
,因此为什么它不适用于字典
而不适用于Linq。另请参见这里的问题:是的,我想知道值
是什么。。。我认为这可能最终是一个列表
,但显然不是。我想知道是否有一个很好的技术原因,或者仅仅“因为”?@Mr.Boy LINQ是一种声明性方法,它不修改源集合,而是以一种懒惰的方式过滤/映射。ForEach有点相反。。。实际上,Select(x=>action(x)).All()
大致相当于。ForEach
但这确实令人困惑,如果您需要非惰性执行,常规的ForEach
将更加自我记录。我的意思是,实际上这似乎不值得。我能写一个循环,有时候你会觉得它们有点脏,有点过时;)我同意你说的我的意思是,在现实中,这似乎不值得。我能写一个循环,有时候你会觉得它们有点脏,有点过时;)我同意你说的