所以我有简单的树:
class MyNode
{
public MyNode Parent;
public IEnumerable<MyNode> Elements;
int group = 1;
}
Run Code Online (Sandbox Code Playgroud)
我有一个IEnumerable<MyNode>.我想得到一个列表MyNode(包括内部节点对象(Elements))作为一个平面列表Where group == 1.如何通过LINQ做这样的事情?
众所周知,Enumerable.SelectMany将序列序列展平为单个序列.如果我们想要一种能够使序列序列序列变平,等等递归的方法怎么办?
我很快就提出了一个实现使用ICollection<T>,即急切评估,但我仍然在摸索如何使用yield关键字进行懒惰评估.
static List<T> Flatten<T>(IEnumerable list) {
var rv = new List<T>();
InnerFlatten(list, rv);
return rv;
}
static void InnerFlatten<T>(IEnumerable list, ICollection<T> acc) {
foreach (var elem in list) {
var collection = elem as IEnumerable;
if (collection != null) {
InnerFlatten(collection, acc);
}
else {
acc.Add((T)elem);
}
}
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?任何.NET语言欢迎中的示例.
我有一个使用这些相同例子的问题 - 这个问题集中在一个不同的问题上.鉴于以下课程:
[XmlRoot]
public class Family {
[XmlElement]
public List<Person> Person;
}
public class Person {
[XmlAttribute("member")]
public MemberType Member { get; set; }
[XmlAttribute("id")]
public int Id { get; set; }
[XmlElement]
public string Surname { get; set; }
[XmlElement]
public string Forename { get; set; }
[XmlElement("Person")]
public List<Person> People;
}
public enum MemberType {
Father,
Mother,
Son,
Daughter
}
Run Code Online (Sandbox Code Playgroud)
如果Family有一个定义如下的方法:
public IEnumerable<Person> Find (Func<Person, bool> predicate) {
// how do I get …Run Code Online (Sandbox Code Playgroud) 我有一个Form名字A.
A包含许多不同的控件,包括main GroupBox.这GroupBox包含许多表和其他GroupBoxes.我想找到一个控件,其形式有例如tab index 9 A,但我不知道哪个GroupBox包含这个控件.
我怎样才能做到这一点?
我有一个IEnumerable集合,它是分层的,因为一个元素包含几个元素.因此,如果我进行计数,我可能得到7-8作为返回int,当真的可能有500个项目(因为它们是嵌套的).
如何将此集合拼成一个包含所有元素且没有嵌套的集合?
谢谢
我正在寻找一种优雅的解决方案,将集合中的子集合聚合为一个大集合。我的问题是某些子集合何时可能为空。
例如:
var aggregatedChildCollection = parentCollection.SelectMany(x=> x.ChildCollection);
Run Code Online (Sandbox Code Playgroud)
如果任何子集合对象为空,这将引发异常。一些替代方案是:
// option 1
var aggregatedChildCollection = parentCollection
.Where(x=>x.ChildCollection != null)
.SelectMany(x => x.ChildCollection);
// option 2
var aggregatedChildCollection = parentCollection
.SelectMany(x => x.ChildCollection ?? new TypeOfChildCollection[0]);
Run Code Online (Sandbox Code Playgroud)
两者都可以工作,但我正在对父级上的相当多的子集合进行某种操作,并且它变得有点令人生厌。
我想要的是创建一个扩展方法来检查集合是否为空,如果是,选项 2 会做什么 - 添加一个空数组。但是我对 Func 的理解并没有达到我知道如何编写这种扩展方法的地步。我知道我想要的语法是这样的:
var aggregatedChildCollection = parentCollection.SelectManyIgnoringNull(x => x.ChildCollection);
Run Code Online (Sandbox Code Playgroud)
是否有一个简单的扩展方法可以实现这一点?