第一个块中的VB代码可以正常工作,并且可以按照其提示进行操作,但是,我现在将其转换为C#,无法终生解决。
我尝试运行C#,但是,我注意到combobox2没有填充。在进一步挖掘时,我发现我的语句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"/>
答案 0 :(得分:2)
VB.NET可能正在。 CStr
上的XElement
进行“智能”转换,以获取值
编辑:感谢TnTinMn指出,这是由于XElement
上的explicit operator通过{{1转换为element.Value
时返回string
}}。
在C#转换中,CStr
的调用行为大不相同。它首先检查System.Convert.ToString()
的实现,如果不存在,将在传入的对象上调用IConvertible/IFormattable
。由于在.ToString()
上没有重载,因此结果将是运行时类型的限定名称(在这种情况下为XElement
)。
因此,在C#中,您需要将比较更改为"System.Xml.Linq.XElement"
:
.Value
或进一步了解var name = from nm in xelement.Elements("Version")
where nm.Element("Trunk").Value == ComboBox1.Text
select nm;
,将其强制转换为字符串:
explicit operator
不幸的是,我所做的很大一部分重构工作是在VB.NET代码库中进行的,令人惊讶的是,有多少这样的小问题会潜伏在幕后。