Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据条件循环通过两个元素_C#_Xml_Algorithm_Linq - Fatal编程技术网

C# 根据条件循环通过两个元素

C# 根据条件循环通过两个元素,c#,xml,algorithm,linq,C#,Xml,Algorithm,Linq,我想循环一个XML树,测试两个条件,并发现一些问题 我不能像整数那样比较像素。我读过一些其他的帖子(除了这个例子),但到目前为止我还没有弄明白 在foreach循环中,我只能更改第一个匹配元素,我希望对所有匹配元素都这样做。我试过所有的方法,但都没有成功 我的XML文件:(用于蛋白质) 海尔克斯尤P1 阿尔法螺旋 1. 2. HELX_P2 阿尔法螺旋 43 53 我的XML文件:(用于atom) 1. 2. N 转动 2. 2. 加利福尼亚州 转动 2. 2. C 转动 1. 3.

我想循环一个XML树,测试两个条件,并发现一些问题

  • 我不能像整数那样比较像素。我读过一些其他的帖子(除了这个例子),但到目前为止我还没有弄明白
  • 在foreach循环中,我只能更改第一个匹配元素,我希望对所有匹配元素都这样做。我试过所有的方法,但都没有成功
  • 我的XML文件:(用于蛋白质)

    
    海尔克斯尤P1
    阿尔法螺旋
    1.
    2.
    HELX_P2
    阿尔法螺旋
    43
    53
    
    我的XML文件:(用于atom)

    
    1.
    2.
    N
    转动
    2.
    2.
    加利福尼亚州
    转动
    2.
    2.
    C
    转动
    1.
    3.
    N
    转动
    
    到目前为止,我的代码是:

    XDocument atom=XDocument.Load(@“C:\Users\RuiGarcia\Documents\MIB\INESC\C\Tutorial\ProjectC\molecular\u 00\PDBLibary\u 00\Data\\ uu 3Q26.xml”);
    XDocument protein=XDocument.Load(@“C:\Users\RuiGarcia\Documents\MIB\INESC\C#Tutorial\ProjectC#\molecular_00\PDBLibary_00\Data\\ u 3Q26.xml”);
    //将二级结构标记类型“turn”更改为helixAlpha或betaSheet
    foreach(蛋白质后代中的XElement amAc(“二级结构”))
    {
    原子元素(“分子”)
    .元素(“原子”)
    其中(x=>(int?)x.Element(“AmAcSeq”)>=(int?)amAc.Element(“AmAcidStart”)和&x=>(int?)ToInt16.x.Element(“AmAcSeq”)x.Element(“StType”).FirstOrDefault().SetValue(amAc.Element(“StType”);
    //Console.WriteLine(amAc.Element(“AmAcidStart”).Value);
    //其中(x=>Convert.ToInt16(x.Element(“AmAcSeq”).Value)Convert.ToInt16(x.Element(“AmAcSeq”).Value)>=Convert.ToInt16(amAc.Element(“AmAcidStart”))
    
    //其中(x=>(int?)x.Element(“AmAcSeq”)>=(int?)amAc.Element(“AmAcidStart”)和&x=>(int?)to int16.x.Element(“AmAcSeq”)您需要第二个
    foreach
    来迭代结果。我提取了一些值,并在下面给出了一个这样做的示例

    XDocument atom = XDocument.Load (@"...\__3Q26.xml");
    XDocument protein = XDocument.Load (@"...\_3Q26.xml");
    
    //Change secondary structure tag type "turn" to helixAlpha or betaSheet
    foreach (XElement amAc in protein.Descendants ("SecondaryStructure"))
    {
        int? start = (int?)amAc.Element("AmAcidStart");
        int? end = (int?)amAc.Element("AmAcidEnd");
        string stType = (string)amAc.Element("StType");
    
        IEnumerable<XElement> atoms = atom.Element("Molecule").Elements("Atom");
    
        // Here we are iterating again in each matching result
        foreach (XElement atomElement in atoms.Where(elem => (int?)elem.Element("AmAcSeq") >= start && (int?)elem.Element("AmAcSeq") <= end))
        {
            atomElement.SetValue(stType);
        }
    }
    
    XDocument atom=XDocument.Load(@“…\ \ u3q26.xml”);
    XDocument protein=XDocument.Load(@“…\ \ u3q26.xml”);
    //将二级结构标记类型“turn”更改为helixAlpha或betaSheet
    foreach(蛋白质后代中的XElement amAc(“二级结构”))
    {
    int?start=(int?)amAc.Element(“AmAcidStart”);
    int?end=(int?)amAc.元素(“AmAcidEnd”);
    string stType=(string)amAc.Element(“stType”);
    IEnumerable atoms=原子。元素(“分子”)。元素(“原子”);
    //在这里,我们将在每个匹配结果中再次迭代
    
    foreach(XElement atomElement in atoms.Where(elem=>(int?)elem.Element(“AmAcSeq”)>=start&&(int?)elem.elem.Element(“AmAcSeq”)您需要第二个
    foreach
    来迭代结果。我提取了一些值,并在下面给出了一个这样做的示例

    XDocument atom = XDocument.Load (@"...\__3Q26.xml");
    XDocument protein = XDocument.Load (@"...\_3Q26.xml");
    
    //Change secondary structure tag type "turn" to helixAlpha or betaSheet
    foreach (XElement amAc in protein.Descendants ("SecondaryStructure"))
    {
        int? start = (int?)amAc.Element("AmAcidStart");
        int? end = (int?)amAc.Element("AmAcidEnd");
        string stType = (string)amAc.Element("StType");
    
        IEnumerable<XElement> atoms = atom.Element("Molecule").Elements("Atom");
    
        // Here we are iterating again in each matching result
        foreach (XElement atomElement in atoms.Where(elem => (int?)elem.Element("AmAcSeq") >= start && (int?)elem.Element("AmAcSeq") <= end))
        {
            atomElement.SetValue(stType);
        }
    }
    
    XDocument atom=XDocument.Load(@“…\ \ u3q26.xml”);
    XDocument protein=XDocument.Load(@“…\ \ u3q26.xml”);
    //将二级结构标记类型“turn”更改为helixAlpha或betaSheet
    foreach(蛋白质后代中的XElement amAc(“二级结构”))
    {
    int?start=(int?)amAc.Element(“AmAcidStart”);
    int?end=(int?)amAc.元素(“AmAcidEnd”);
    string stType=(string)amAc.Element(“stType”);
    IEnumerable atoms=原子。元素(“分子”)。元素(“原子”);
    //在这里,我们将在每个匹配结果中再次迭代
    
    foreach(XElement-atomElement in-atoms.Where(elem=>(int?)elem.Element(“AmAcSeq”)>=start&(int?)elem.elem.Element(“AmAcSeq”)我在这里看到了几个问题:

  • 您需要使用嵌套的
    foreach
    循环,而不是
    FirstOrDefault()

  • 您的条件
    (int?)到int16.x.Element(“AmAcSeq”)我在这里看到了几个问题:

  • 您需要使用嵌套的
    foreach
    循环,而不是
    FirstOrDefault()

  • 您的条件
    (int?)ToInt16.x.Element(“AmAcSeq”)1)格式化代码的最简单方法是在Visual Studio中自动格式化,然后在此处复制/粘贴。2)请共享一个产生问题的XML示例。3)您的代码甚至没有编译--
    ToInt16.x.Element(“AmAcSeq”)是什么
    ?如果你能为你的问题创建一个解决方案,我们就更有可能提供帮助。如果你发布了一小段XML,我会提供帮助。我刚刚添加了我的XML示例文件。在你给出的示例中,你的
    Atom
    XElements具有
    AmAcSeq=2
    ,这将与你的
    SecondaryStructure
    XElements不匹配。目标是c比较原子数AmAcSeq是否介于蛋白质数AmAcStart和AmAcEnd之间。如果为true,则将原子的StType更改为蛋白质的StType。StType atom默认值为turn。我将更改示例,以便有条件同时更改两者。1)格式化代码最简单的方法是在Visual Studio中自动格式化,然后在此处复制/粘贴。2)请分享一个产生问题的XML示例。3)您的代码甚至没有编译--“什么是
    ToInt16.x.Element”(“AmAcSeq”)
    ?如果你能为你的问题创建一个解决方案,我们就更有可能提供帮助。如果你发布了一小段XML,我会提供帮助。我刚刚添加了我的XML示例文件。在你给出的示例中,你的
    Atom
    XElements具有
    AmAcSeq=2
    ,这将与你的
    SecondaryStructure
    XElements不匹配。目标是compare如果原子数AmAcSeq介于蛋白质数AmAcStart和AmAcEnd之间。如果为true,则将StType of atom更改为蛋白质的StType。StType atom默认值为turn。我将更改示例,以便有条件同时更改两者。我已尝试了两种解决方案。dbc的解决方案效果良好,可直接在foreach似乎是一个很好的实践。Guvante的解决方案返回了两个错误,可能是因为我缺少引用:错误是:“无法将'System.Collections.Generic.IEnumerable'隐式转换为System.XML.Linq.XElement。存在显式转换(缺少转换?@ruiabg:Nope,我的错误。我通常
    XDocument atom = XDocument.Load (@"...\__3Q26.xml");
    XDocument protein = XDocument.Load (@"...\_3Q26.xml");
    
    //Change secondary structure tag type "turn" to helixAlpha or betaSheet
    foreach (XElement amAc in protein.Descendants ("SecondaryStructure"))
    {
        int? start = (int?)amAc.Element("AmAcidStart");
        int? end = (int?)amAc.Element("AmAcidEnd");
        string stType = (string)amAc.Element("StType");
    
        IEnumerable<XElement> atoms = atom.Element("Molecule").Elements("Atom");
    
        // Here we are iterating again in each matching result
        foreach (XElement atomElement in atoms.Where(elem => (int?)elem.Element("AmAcSeq") >= start && (int?)elem.Element("AmAcSeq") <= end))
        {
            atomElement.SetValue(stType);
        }
    }
    
            foreach (XElement secondaryStructure in protein.Descendants ("SecondaryStructure"))
            {
                foreach (var atomStType in atom.Element ("Molecule")
                    .Elements ("Atom")
                    .Where(a => (int?)a.Element("AmAcSeq") >= (int?)secondaryStructure.Element("AmAcidStart") && (int?)a.Element("AmAcSeq") <= (int?)secondaryStructure.Element("AmAcidEnd"))
                    .Select (a => a.Element("StType")))
                {
                    atomStType.SetValue((string)secondaryStructure.Element("StType"));
                }
            }