foreach 没有很好地阅读 .descendants 并在 if 之前转到 else 语句
Posted
技术标签:
【中文标题】foreach 没有很好地阅读 .descendants 并在 if 之前转到 else 语句【英文标题】:foreach isn't reading well through .descendants and goes to else statement before if 【发布时间】:2021-03-26 02:34:24 【问题描述】:我仍在学习 C#
我目前正在开发一个过滤器系统,并且有一个 if 语句列表可以阻止用户执行任何操作。现在是不是每当用户提交 ID 时,我的 foreach 都应该遍历已提交 ID 的列表,检查它们是否已经存在。
错误是当用户提交一个已经存在的 ID 时,它在第一次运行时不会看到现有 ID,因此它会创建并填写一个节点,但在第二次运行时它会发送错误消息& 中断会话。
我的代码:
private async void btnAddId_Click(object sender, RoutedEventArgs e)
XmlDocument Xdoc = new XmlDocument();
Xdoc.Load(xmldoc);
XmlNode NodeEl = Xdoc.SelectSingleNode("root/filter/filter_item");
XmlNode NodeList = Xdoc.SelectSingleNode("root/filter");
var root = XDocument.Load(xmldoc).Root;
var filter = root.Element("filter");
int parsedValue;
foreach (var f in filter.Descendants())
if (f.Value == tbAddId.Text)
MessageBox.Show("Value already exists in the orderlist!");
else if (!int.TryParse(tbAddId.Text, out parsedValue))
MessageBox.Show("Input isn't numeric!");
else if (tbAddId.Text == "")
MessageBox.Show("No value was given!");
else if (tbAddId.Text == "Add ID")
MessageBox.Show("No value was given!");
else if (NodeList.InnerText == "")
NodeEl.InnerText = tbAddId.Text;
tbAddId.Text = "Add ID";
tbAddId.Foreground = Brushes.Gray;
await api.config_Load();
await api.Page_Load();
else
XmlNode filterItem = Xdoc.CreateElement("filter_item");
NodeList.AppendChild(filterItem);
filterItem.InnerText = tbAddId.Text;
tbOrderDisplay.Text += f.Value + " ";
Xdoc.Save(xmldoc);
XML 内容
<?xml version="1.0"?>
<root>
<bol_client_id></bol_client_id>
<!--- this is the client id-->
<bol_client_secret></bol_client_secret>
<!-- this is the client secret -->
<customer_id></customer_id>
<company_phone></company_phone>
<auth_token_url></auth_token_url>
<bol_orders_url></bol_orders_url>
<debug_mode>true</debug_mode>
<filter>
<filter_item>1172828940</filter_item>
<filter_item>1173700637</filter_item>
</filter>
</root>
【问题讨论】:
Ofc,我会在里面编辑它 【参考方案1】:在尝试插入之前检查值是否存在:
private async void btnAddId_Click(object sender, RoutedEventArgs e)
XmlDocument Xdoc = new XmlDocument();
Xdoc.Load(xmldoc);
XmlNode NodeEl = Xdoc.SelectSingleNode("root/filter/filter_item");
XmlNode NodeList = Xdoc.SelectSingleNode("root/filter");
var root = XDocument.Load(xmldoc).Root;
var filter = root.Element("filter");
int parsedValue;
//1. Check for duplicates
foreach (var f in filter.Descendants())
if (f.Value == tbAddId.Text)
MessageBox.Show("Value already exists in the orderlist!");
tbOrderDisplay.Text += f.Value + " ";
return;
//2. Validate and insert
if (!int.TryParse(tbAddId.Text, out parsedValue))
MessageBox.Show("Input isn't numeric!");
else if (tbAddId.Text == "")
MessageBox.Show("No value was given!");
else if (tbAddId.Text == "Add ID")
MessageBox.Show("No value was given!");
else if (NodeList.InnerText == "")
NodeEl.InnerText = tbAddId.Text;
tbAddId.Text = "Add ID";
tbAddId.Foreground = Brushes.Gray;
await api.config_Load();
await api.Page_Load();
else
XmlNode filterItem = Xdoc.CreateElement("filter_item");
NodeList.AppendChild(filterItem);
filterItem.InnerText = tbAddId.Text;
Xdoc.Save(xmldoc);
【讨论】:
以上是关于foreach 没有很好地阅读 .descendants 并在 if 之前转到 else 语句的主要内容,如果未能解决你的问题,请参考以下文章
如何在散列中获取Powershell ACL信息以便很好地打印到文件中
Sqlalchemy 可以很好地处理多个附加的 SQLite 数据库文件吗?