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 数据库文件吗?

我没有很好地关闭 --yarn dev- (端口 4444 已经在使用中。)

具有对数轴的 JavaFX 折线图没有很好地更新[关闭]

说说语义化