Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 收益率冻结_C#_Linq - Fatal编程技术网

C# 收益率冻结

C# 收益率冻结,c#,linq,C#,Linq,假设我有这样一种方法: IEnumerable<record> GetSomeRecords() { while(...) { yield return aRecord } } IEnumerable GetSomeRecords() { 而(…) { 收益率记录 } } 现在,假设我有一个调用者,它也返回相同类型的枚举,类似这样 IEnumerable<record> ParentGetSomeRecords() { // I want to

假设我有这样一种方法:

IEnumerable<record> GetSomeRecords()
{
  while(...)
  {
    yield return aRecord
  }
}
IEnumerable GetSomeRecords()
{
而(…)
{
收益率记录
}
}
现在,假设我有一个调用者,它也返回相同类型的枚举,类似这样

IEnumerable<record> ParentGetSomeRecords()
{
  // I want to do this, but for some reason, my brain locks right here
  foreach(item in someItems)
    yield return GetSomeRecords();
}
IEnumerable ParentGetSomeRecords()
{
//我想这么做,但出于某种原因,我的大脑锁定在这里
foreach(某些项目中的项目)
收益返回GetSomeRecords();
}
该代码得到语法错误,因为yield return需要一个类型记录,而我返回的是一个IEnumerable记录

我想要一个“扁平”的IEnumerable,它扁平化一个嵌套的枚举循环。这让我发疯,因为我知道我以前做过这件事,但我似乎不记得是什么了。有什么提示吗?

怎么样:

IEnumerable<record> ParentGetSomeRecords()
{
    var nestedEnumerable = <whatever the heck gets your nested set>;
    // SelectMany with an identity flattens 
    // IEnumerable<IEnumerable<T>> to just IEnumerable<T>
    return nestedEnumerable.SelectMany(rec => rec);
}
IEnumerable ParentGetSomeRecords()
{
var nestedEnumerable=;
//选择多个具有标识的对象将变平
//从IEnumerable到刚才的IEnumerable
返回nestedEnumerable.SelectMany(rec=>rec);
}

效率低下,但您可以使用:

List<Record> rcrdList = new List<Record>();
foreach (var item in someItems)
{
    rcrdList.AddRange(item.GetSomeRecords());
}
return rcrdList;
List rcrdList=newlist();
foreach(someItems中的var项)
{
rcrdList.AddRange(item.GetSomeRecords());
}
返回rcrdList;

这就是你想要的吗

IEnumerable<record> ParentGetSomeRecords()
{
    foreach(var item in someItems)
        foreach(var record in GetSomeRecords())
            yield return record;
}
这两种扩展方法可以这样使用:

record rec = ...;
IEnumerable<record> flattened = rec.BreadthFirstFlatten(r => r.ChildRecords);
IEnumerable<records> records = ...;
IEnumerable<record> flattened = records.BreadthFirstFlatten(r => r.ChildRecords);
IEnumerable记录=。。。;
IEnumerable flatten=records.BroadthFirstFlatten(r=>r.ChildRecords);
或者从相反的方向:

IEnumerable<record> records = ...;
IEnumerable<record> flattened = records.BreadthFirstFlatten(r => r.ParentRecords);
IEnumerable记录=。。。;
IEnumerable flatten=records.breadthfirstflatte(r=>r.ParentRecords);
所有这些扩展方法都是迭代的,因此不受堆栈大小的限制


我有很多这样的方法,包括预排序和后排序深度优先遍历,如果你想看到它们,我会做一个repo并上传到某个地方:)

我不知道你说的“一个平面IEnumerable”是什么意思在这种情况下-您能展示一个预期返回类型/数据的示例吗?您是否必须使用
收益返回
?如果您只想以物化列表的形式返回数据(不进行任何数据转换),您可以使用GetSomeRecords().ToList()。这就是你想要的吗?@JMarsch:GetSomeRecords()和父GetSomeRecords()之间的关系不清楚;你应该描述它们之间的关系。
ParentGetSomeRecords()
是否返回某种树?
Record
是自引用类型吗?我认为他有一个永无止境的子项链。这只适用于第一级子项。@Mattytomo是的,他不得不重读几遍……用解释性注释编辑可能就是他想要的+1我认为他的
record
类有一个
IEnumerable
,因此它可能是
n
级别。这只适用于第一种情况level@mattytommo我将发布我的答案的更新,以防这是他想要的。你可以使用这种方法的扩展“展开”递归序列。顺便说一句@MatthewWatson几乎是我发布的内容,除了我更新的代码是迭代的,对我来说没有堆栈溢出^^
IEnumerable<records> records = ...;
IEnumerable<record> flattened = records.BreadthFirstFlatten(r => r.ChildRecords);
IEnumerable<record> records = ...;
IEnumerable<record> flattened = records.BreadthFirstFlatten(r => r.ParentRecords);