转换字典<string,list <foo>&gt;在C#2.0列出<foo> </foo> </string,列出<foo>

时间:2010-10-27 21:34:09

标签: c# list dictionary

还有其他方法直接从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时不使用每个循环。

5 个答案:

答案 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()

更难的解决方案:

  1. 定义一个实现IList的类,它有一个构造函数,它接受一个ValueCollection或ICollection
  2. 实现所有方法。您可以跟踪所有T列表以及您正在处理的当前列表的索引。
  3. 使用

    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,这很麻烦。