在LINQ to Objects中,可以很容易地使用谓词过滤集合的子集,例如,如果我的领域类是Person
,集合是persons
,谓词Func<Person, bool> filter
,它将是类似persons.Where(filter).ToArray()
的东西。
与序列化为XElement
的人员集合相同的函数:
XElement[] xFiltered = xPersons.Elements("Person")
.Where(xFilter)
.ToArray();
其中xPersons
是根元素,包含Person的元素(每个元素都命名为"Person"),Func<XElement, bool> xFilter
是在XElement
上定义的谓词,作为参数类型。
我想知道是否存在一个直接的可能性来创建一个Where
语句在LINQ的XML,将采取类型的谓词Func<Person, bool>
作为参数,而不是Func<XElement, bool>
?为此,需要实现一个转换器,将Func<Person, bool>
转换为Func<XElement, bool>
,但这似乎是一个反直觉的、容易出错的练习。是否可以设想这种真正的转换器(例如基于检查)?或者它只是存在?
您可以在底层的XElement和XAttribute上构建谓词,例如
xPersons.Elements("Person")
.Where(e => (string)e.Attribute("Name") == "Alex")
要使用Person
类,您需要首先对其进行反序列化:
xPersons.Elements("Person")
.Select(e => CreatePerson(e))
.Where(p => p.Name == "Alex")
private static Person CreatePerson(XElement element)
{
// your (de)serialization logic goes here
}
或者您可以在类中编写显式强制转换操作符:
xPersons.Elements("Person")
.Where(e => ((Person)e).Name) == "Alex")
public static explicit operator Person(XElement element)
{
// your (de)serialization logic goes into your Person class
}