第一个 block 中的 VB 代码运行良好,并且按照其说明执行操作,但是,我现在正在将其转换为 C#,并且我一辈子都无法弄清楚它是怎么回事。
我尝试运行 C#,但是,我注意到组合框 2 没有填充。经过进一步挖掘,我发现我的语句 name = xxxxxx
实际上没有返回任何内容。
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
ComboBox2.DataSource = null
ComboBox2.Items.Clear()
ComboBox2.Text = ""
Dim name =
From nm In xelement.Elements("Version")
Where CStr(nm.Element("Trunk")) = ComboBox1.Text
Select nm
For Each xEle As XElement In name
Dim branches = xEle.Elements("Branch").ToDictionary(
Function(k) If(String.IsNullOrEmpty(k.Value), k.Attribute("Name").Value, k.Value),
Function(v) If(v.Attribute("Path") Is Nothing, "", v.Attribute("Path").Value))
Console.WriteLine(xEle)
ComboBox2.DataSource = New BindingSource(branches, Nothing)
ComboBox2.DisplayMember = "Key"
ComboBox2.ValueMember = "Value"
Next
End Sub
private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
ComboBox2.DataSource = @null;
ComboBox2.Items.Clear();
ComboBox2.Text = "";
var name = from nm in xelement.Elements("Version")
where System.Convert.ToString(nm.Element("Trunk")) == ComboBox1.Text
select nm;
foreach (XElement xEle in name)
{
var branches = xEle.Elements("Branch").ToDictionary(k => string.IsNullOrEmpty(k.Value) ? k.Attribute("Name").Value : k.Value, v => v.Attribute("Path") == null ? "" : v.Attribute("Path").Value);
Console.WriteLine(xEle);
ComboBox2.DataSource = new BindingSource(branches, null);
ComboBox2.DisplayMember = "Key";
ComboBox2.ValueMember = "Value";
}
}
xml 摘录
<Version>
<Trunk>Software Version 7.2</Trunk>
<Branch Name=".24777 (Internal)" Path="T:\2014\Product\xxxxxxxxx\Internal\Internal"/>
<Trunk>Software Version 7.4</Trunk>
<Branch Name=".103 (Internal)" Path="T:\2015\Product\xxxxxxx\ Internal\Internal"/>
最佳答案
VB.NET 可能正在使用 CStr
进行“智能”转换上XElement
检索值。
编辑:感谢TnTinMn指出这是由于 explicit operator上XElement
返回element.Value
当转换到 string
时通过CStr
。
在 C# 转换中,调用 System.Convert.ToString()
行为有很大不同。它首先检查 IConvertible/IFormattable
实现,如果这些不存在将调用 .ToString()
在传入的对象上。因为这在 XElement
上没有重载,结果将是运行时类型的完全限定名称(在本例中为 "System.Xml.Linq.XElement"
)。
因此,在 C# 中,您需要将比较更改为 .Value
:
var name = from nm in xelement.Elements("Version")
where nm.Element("Trunk").Value == ComboBox1.Text
select nm;
或者进一步了解explicit operator
,转换为字符串:
var name = from nm in xelement.Elements("Version")
where (string)nm.Element("Trunk") == ComboBox1.Text
select nm;
不幸的是,我所做的重构的很大一部分是在 VB.NET 代码库中进行的,令人惊讶的是,幕后可能潜藏着如此多的小问题。
关于c# - VB 到 C# - 无法读取 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52084453/