C# 根据条件循环通过两个元素
我想循环一个XML树,测试两个条件,并发现一些问题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.
海尔克斯尤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"));
}
}