如何在 ExpandoObject 的通用列表中搜索
How to search in generic list of ExpandoObject
跟进我的 。我现在正试图找到 XML 部分的特定出现。例如在下面 XML
(部分)
<?xml version="1.0" encoding="utf-8" ?>
<definition date="2021-04-30" version="1.01">
<changes>
<change number="1" date="2021-04-30" description="Added .." />
<change number="2" date="2021-04-30" description="Changes in .." />
<change number="3" date="2021-04-30" description="Fixed .." />
<change number="4" date="2021-05-11" description="Added " />
</changes>
<general>
<styles>
<style name="title">
<font name="Arial" size="12" bold="true"/>
</style>
<style name="general">
<font name="Courier new" size="10" bold="true" />
</style>
<style name="header">
<font name="Courier new" size="10" bold="false" />
</style>
</styles>
</general>
我想找零钱 3。
我正在使用 Dandraka XML-Utilities 使 XML 成为一个 ExpandoObject。这应该让我很容易获得特定的价值。例如,使用上面的方法我可以得到这样的定义日期和版本:
Dim strXML As String
strXML = File.ReadAllText("C:\Tools\ReportDefinitions.xml")
Dim def As Object
def = XmlSlurper.ParseText(strXML)
Console.WriteLine(def.date)
Console.WriteLine(def.version)
我想使用 Linq 就行了:def.changes.changeList。但简单地说:
def.changes.changeList.where(Function(c) c.number = "1").count()
where
部分出错。在 SO 上搜索过,但大多数示例都在 C# 中,将它们翻译成 VB.net 最终导致无法编译。
假设我必须投射它,但如何投射?
在 C# 中,可以将 Linq 与此结合使用:
var iet = def.changes.changeList;
var iets = (IEnumerable)def.changes.changeList;
var iets2 = iets.Cast<dynamic>();
var iets3 = iets2.FirstOrDefault(p => p.number == "3");
int iets4 = iets3.number;
Console.WriteLine(iets4);
现在 VB.Net 我可以像这样完成大部分工作:
Dim iet As Object = def.changes.changeList
Dim iets = CType(def.changes.changeList, IEnumerable)
但是这一行:
var iets2 = iets.Cast<dynamic>();
不知道如何将其转换为 VB.Net..
谢谢
我不知道 Dandraka XML 这可能是一种将 xml 转换为对象的方法。我不会去那里,而是使用普通的 System.Xml
库来阅读内容并使用 XPath 找到您需要的内容。所以这不是一个确切的答案,而更像是获得相同结果的替代答案。
Dim doc As New XmlDocument()
doc.Load("c:\temp\data.xml")
Dim root As XmlNode = doc.DocumentElement
Console.WriteLine("Definition date " & root.Attributes("date").Value)
Console.WriteLine("Definition version " & root.Attributes("version").Value)
Console.WriteLine()
Dim node As XmlNode = root.SelectSingleNode("changes/change[@number='3']")
Console.WriteLine(node.Attributes("date").Value & " - " & node.Attributes("description").Value)
这将为您提供以下输出
Definition date 2021-04-30
Definition version 1.01
2021-04-30 - Fixed ..
我安装了 Dandraka XML 并找到了答案。问题在于 Linq 不仅仅适用于 IEnumerable,还需要 IEnumerable<T>
之类的东西。因此,如果您将 changeList 转换为 List(Of Dandraka.XmlUtilities.ToStringExpandoObject)
类型,那么您可以在其上使用 Linq。在 Linq 函数中,还有另一个转换为 Object 的方法,因此我们可以访问动态属性。
Dim def = XmlSlurper.ParseText(File.ReadAllText("c:\temp\data.xml"))
Console.WriteLine("Definition date " & def.date.ToString)
Console.WriteLine("Definition version " & def.version.ToString)
Console.WriteLine()
Dim list As List(Of Dandraka.XmlUtilities.ToStringExpandoObject) = def.changes.changeList
Dim number3 As Object = list.FirstOrDefault(Function(i) CType(i, Object).number = "3")
Console.WriteLine(number3.date.ToString & " - " & number3.description.ToString)
Console.ReadLine()
跟进我的
<?xml version="1.0" encoding="utf-8" ?>
<definition date="2021-04-30" version="1.01">
<changes>
<change number="1" date="2021-04-30" description="Added .." />
<change number="2" date="2021-04-30" description="Changes in .." />
<change number="3" date="2021-04-30" description="Fixed .." />
<change number="4" date="2021-05-11" description="Added " />
</changes>
<general>
<styles>
<style name="title">
<font name="Arial" size="12" bold="true"/>
</style>
<style name="general">
<font name="Courier new" size="10" bold="true" />
</style>
<style name="header">
<font name="Courier new" size="10" bold="false" />
</style>
</styles>
</general>
我想找零钱 3。 我正在使用 Dandraka XML-Utilities 使 XML 成为一个 ExpandoObject。这应该让我很容易获得特定的价值。例如,使用上面的方法我可以得到这样的定义日期和版本:
Dim strXML As String
strXML = File.ReadAllText("C:\Tools\ReportDefinitions.xml")
Dim def As Object
def = XmlSlurper.ParseText(strXML)
Console.WriteLine(def.date)
Console.WriteLine(def.version)
我想使用 Linq 就行了:def.changes.changeList。但简单地说:
def.changes.changeList.where(Function(c) c.number = "1").count()
where
部分出错。在 SO 上搜索过,但大多数示例都在 C# 中,将它们翻译成 VB.net 最终导致无法编译。
假设我必须投射它,但如何投射?
var iet = def.changes.changeList;
var iets = (IEnumerable)def.changes.changeList;
var iets2 = iets.Cast<dynamic>();
var iets3 = iets2.FirstOrDefault(p => p.number == "3");
int iets4 = iets3.number;
Console.WriteLine(iets4);
现在 VB.Net 我可以像这样完成大部分工作:
Dim iet As Object = def.changes.changeList
Dim iets = CType(def.changes.changeList, IEnumerable)
但是这一行:
var iets2 = iets.Cast<dynamic>();
不知道如何将其转换为 VB.Net..
谢谢
我不知道 Dandraka XML 这可能是一种将 xml 转换为对象的方法。我不会去那里,而是使用普通的 System.Xml
库来阅读内容并使用 XPath 找到您需要的内容。所以这不是一个确切的答案,而更像是获得相同结果的替代答案。
Dim doc As New XmlDocument()
doc.Load("c:\temp\data.xml")
Dim root As XmlNode = doc.DocumentElement
Console.WriteLine("Definition date " & root.Attributes("date").Value)
Console.WriteLine("Definition version " & root.Attributes("version").Value)
Console.WriteLine()
Dim node As XmlNode = root.SelectSingleNode("changes/change[@number='3']")
Console.WriteLine(node.Attributes("date").Value & " - " & node.Attributes("description").Value)
这将为您提供以下输出
Definition date 2021-04-30
Definition version 1.01
2021-04-30 - Fixed ..
我安装了 Dandraka XML 并找到了答案。问题在于 Linq 不仅仅适用于 IEnumerable,还需要 IEnumerable<T>
之类的东西。因此,如果您将 changeList 转换为 List(Of Dandraka.XmlUtilities.ToStringExpandoObject)
类型,那么您可以在其上使用 Linq。在 Linq 函数中,还有另一个转换为 Object 的方法,因此我们可以访问动态属性。
Dim def = XmlSlurper.ParseText(File.ReadAllText("c:\temp\data.xml"))
Console.WriteLine("Definition date " & def.date.ToString)
Console.WriteLine("Definition version " & def.version.ToString)
Console.WriteLine()
Dim list As List(Of Dandraka.XmlUtilities.ToStringExpandoObject) = def.changes.changeList
Dim number3 As Object = list.FirstOrDefault(Function(i) CType(i, Object).number = "3")
Console.WriteLine(number3.date.ToString & " - " & number3.description.ToString)
Console.ReadLine()