还有其他方法直接从ValueCollection获取List<foo>
。
目前我正在使用以下代码
Dictionary<string,List<foo>> dic;
List<foo> list= new List<foo>();
foreach (List<foo> var in dic.Values)
{
list.AddRange(var);
}
OR
List<List<foo>> list= new List<List<foo>>(dic.Values);
以上转换为我提供了List<List<foo>
,但我希望来自dic.values的List<foo>
,如果可能的话,使用.NET 2.0时不使用每个循环。
答案 0 :(得分:2)
不使用LINQ或.NET 3.5,如果没有某种for
循环,我不知道有什么方法可以做到这一点。即使使用LINQ,框架中的某个地方foreach
也会做同样的事情。
如果您被链接到.NET 2.0但可以访问更高版本的C#编译器版本,则可以使用LinqBridge.dll来实现相同的效果 - 请阅读here。请注意,这至少需要VS 2008(针对2.0框架)。如果你可以使用它,那么你所要做的就是
using System.Linq;
...
dic.Values.SelectMany(v => v).ToList();
答案 1 :(得分:1)
编辑:简单的LINQ解决方案(在.NET 2.0中不可用)
dic.Values.SelectMany(list => list).ToList()
如果您不需要List并且IEnumerable可以,那么请关闭ToList()
更难的解决方案:
使用
return new MyListCombiner<foo>(dict.Values);
答案 2 :(得分:1)
你的foreach循环应该是
Dictionary<string,List<foo>> dic;
List<foo> list= new List<foo>();
foreach (List<foo> var in dic.Values)
{
foreach(foo bar in var){
list.AddRange(bar);
}
}
当您想要将每个列表的每个项目添加到列表中时,您将每个列表添加到列表中。
完全错过了你问题中的每个循环部分。
我不认为在C#2.0中这是可能的。 LINQ的核心只是在IEnumerable
上进行迭代,这是foreach正在做的所有事情
答案 3 :(得分:0)
最终,您选择的任何方法都将涉及某种抽象级别的for循环。如果您使用纯.NET 2.0,则必须在代码中的某处编写for循环。这种数据集合是LINQ的主要目的之一。请参阅SelectMany
方法:
http://msdn.microsoft.com/en-us/library/system.linq.enumerable.selectmany.aspx
根据您的要求,您可以链接到.NET 3.0 / 3.5,但仍然可以在较旧版本的工具集上进行编译。你仍然必须在运行应用程序的盒子上有3.0 / 3.5,但不必升级你的工具。语法也看起来不那么性感,因为您必须通过静态方法语法访问扩展方法。
答案 4 :(得分:0)
在C#2.0中,您必须使用循环或Poor Man's LINQ,其代码如下所示:
Linq(dic.Values).SelectMany(delegate(List<foo> list) { return list; }).ToList()
将Linq()定义为
static PoorMansLinq<T> Linq<T>(IEnumerable<T> source)
{
return new PoorMansLinq<T>(source);
}
我注意到第一行目前无效,我提交了一个更新来修复它。在此期间,您可以使用以下方法作为解决方法:
Linq(Linq(dic.Values).SelectMany(delegate(List<foo> list) { return list; })).ToList()
您也可以使用LinqBridge,并直接调用Enumerable,但如果没有C#3.0,这很麻烦。