2015-07-12 96 views
0

我正在寻找一种通用类适配器,它使我能够通过单个迭代器遍历集合(IEnumerable的IEnumerable)集合的集合。一个通用适配器迭代项目集合集合

换句话说:如何通过让用户看起来像是一个单一的平面集合来伪造集合的集合。

例子: 对于这样的结构:

public class Signal 
{ 
    Point[] points; 
} 

public class Analysis 
{ 
    List<Signal> Signals; 
} 

我想有一个通用的接口,使我能够迭代分析对象的每一个点。

适配器将使我能够做的事:

var analysisInnerCollectionOfPointAdapter = 
    new GenericCollectionOfCollectionAdapterIterator(myAnalysis); 

     foreach(Point point in AnalysisInnerCollectionOfPointAdapter) 
     { 
      ... 
     } 

我不希望创建任何重复的集合。我只是想从我的迭代中抽象出内在步骤(集合的集合)。

我刚开始尝试编程它,但我想知道是否没有已经存在的东西可能会比我未来的潜在创作更好。也许在像Linq或MoreLinq这样的现有库中?也许你已经做到了,有一些不错的东西?

编辑(一个小时后): 我刚刚发现:Difference Between Select and SelectMany这给我一个很好的例子,我想要的。感谢AlexeiLevenkov。

+1

你的意思是“如果有'Enumerable.SelectMany',它会不会很好? –

+0

@AlexeiLevenkov仍然创建数据副本 – DavidG

+0

@DavidG SelectMany不会创建任何副本 - 它与大多数其他LINQ操作(如选择/位置)类似...不确定您想要的代码是“数据副本“(我不相信你可以避免复制值类型,但它看起来不像OP需要避免的那样)......'analysis.Signal.SelectMAny(x => x)'只复制'Point',假设它是值类型... –

回答

0

几个月后...... AlexeiLevenko没有张贴his answer

的SelectMany不创造任何副本 - 它类似于像选择/在哪里...不知道你有什么样的代码大多数其他LINQ操作在心中说“数据的副本”(我不相信你可以避免复制值类型,但它看起来不像OP需要避免那样)...

analysis.Signal.SelectMAny(x=>x)只有副本Point假设它是值类型...

+0

如果你的答案是他人的工作,你应该回答社区维基。 – durron597

+0

我认为你引用的链接是:http://stackoverflow.com/questions/19601143/whats-the-best-way-to-apply-a-join-method-generically-similar-to-how-string- Ĵ –