[英]Whats a quick way to convert an IEnumerable<Foo> to List<Foo> in C# 2.0?
[英]Convert Dictionary<string,List<foo>> to List<foo> in C# 2.0
有没有其他方法直接从ValueCollection获取List<foo>
。
目前我正在使用下面的代码
Dictionary<string,List<foo>> dic;
List<foo> list= new List<foo>();
foreach (List<foo> var in dic.Values)
{
list.AddRange(var);
}
要么
List<List<foo>> list= new List<List<foo>>(dic.Values);
上面的转换给我List<List<foo>
但是我希望来自dic.values的List<foo>
而不使用每个循环,如果可能的话使用.NET 2.0。
在没有使用LINQ或.NET 3.5的情况下,如果没有某种for
循环,我不知道有什么方法可以做到这一点。 即使使用LINQ,在框架中的某个地方, foreach
也会做同样的事情。
如果您被链接到.NET 2.0但可以访问更高版本的C#编译器版本,则可以使用LinqBridge.dll来实现相同的效果 - 请在此处阅读。 请注意,这至少需要VS 2008(针对2.0框架)。 如果你可以使用它,那么你所要做的就是
using System.Linq;
...
dic.Values.SelectMany(v => v).ToList();
编辑:简单的LINQ解决方案(在.NET 2.0中不可用)
dic.Values.SelectMany(list => list).ToList()
如果您不需要List并且IEnumerable可以,那么请关闭ToList()
更难的解决方案:
使用
return new MyListCombiner<foo>(dict.Values);
你的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正在做的事情
最终,您选择的任何方法都将涉及某种抽象级别的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,但不必升级你的工具。 语法也看起来不那么性感,因为您必须通过静态方法语法访问扩展方法。
在C#2.0中,您必须使用循环或穷人的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,这很麻烦。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.