C# if-else if用于变量C的多个可能值#
我有一个if-else-if构造,其中我根据XName元素本地名设置变量的特定值,如下所示:C# if-else if用于变量C的多个可能值#,c#,if-statement,C#,If Statement,我有一个if-else-if构造,其中我根据XName元素本地名设置变量的特定值,如下所示: public struct UserObject { public string rawValue; } var xmlElements= record.Descendants("abc") .Select(x => x.Elements().ToArray()); f
public struct UserObject
{
public string rawValue;
}
var xmlElements= record.Descendants("abc")
.Select(x => x.Elements().ToArray());
foreach (XElement[] elements in xmlElements)
{
foreach (XElement element in elements)
{
UserObject userObject = new UserObject();
if (element.Name.LocalName == "b036") //"b036" is a XML element tag name
userObject.rawValue = (element.Value.Trim()); //note rawvalue is of string type
else if (element.Name.LocalName == "b037")
userObject.rawValue = (element.Value.Trim());
else if (element.Name.LocalName == "b040")
userObject.rawValue = (element.Value.Trim());
}
对于要加载的userObject(rawvalue
)的名称,我希望遵循以下层次顺序:-
b036, PersonName (e.g., John Smith) if not available use b037
b037, PersonName (e.g., Smith, John) if not available use b040
b040, KeyNames, a.k.a Last Name (e.g., Smith)
If none of b036, b037 or b040 are found, I do not want to set the "rawvalue" for that record
如何构造if-else语句,或者应该使用switch-case语句来实现相同的功能?由于要查找某些元素中最高的值,请执行max搜索。通过自己滚动,您可以避免扫描或测试两次 首先,创建一个变量来表示感兴趣的名称的优先级:
var hierarchy = new[] { "b040", "b037", "b036" };
现在设置一些变量以记住迄今为止找到的最大候选变量:
XElement candidate = null;
int candidatePos = -1;
最后,检查所有XMLElement
值并记住找到的最大值:
foreach (var element in xmlElements.SelectMany(elements => elements)) {
var pos = Array.IndexOf(hierarchy, element.Name.LocalName);
if (pos >= 0) {
if (candidate == null || pos > candidatePos) {
candidate = element;
candidatePos = pos;
}
}
}
如果找到最大值,可以使用它:
if (candidate != null) { //"b036" is a XML element tag name
UserObject userObject = new UserObject();
userObject.rawValue = (candidate.Value.Trim()); //note rawvalue is of string type
// work with userObject
}
它是字符串类型->对象是自定义用户定义的对象,并将其添加到所有三个if-else块中的类似对象列表中,以执行相同的操作。您应该在列表中创建一个字符串列表,其中包含
b036
、b037
和b040
,然后在列表上使用Contains
Linq方法检查element.Name.LocalName
是否在列表中,并设置userObject.rawValue
的值如果是真的,我想根据哪个元素设置原始值**“b036”->“b037”->“b040”**(这是需要的层次顺序)有一个值;如果“b036”XElement不存在,则应将该值设置为XElement标记“b037”中存在的任何值,否则设置为“b040”@Darshak我相信您需要以基本上其他的方式实现代码,使用2种方法:(1)根据层次结构找到任何合适的元素;(2)从找到的方法中提取名称。项(1)应该尝试搜索每个元素并首先返回满意的结果。此外,如果没有必需的元素,请检查大小写。@RustemMustafin您可以给我演示此方法的实现吗?我想根据哪个元素“b036”->“b037”->“b040”有值来设置原始值;如果“b036”“XElement不存在它应该将值设置为XElement标记“b037”中的任何值,否则设置为“b040”@Darshak这将复制您的代码。由于您只引用了一个元素
变量,因此我看不出您的代码如何更改为第一个元素。我正在寻找代码的这一部分,以查看哪个元素存在并首先出现。我想将rawValue设置为元素的特定值这似乎对我不起作用;这只提供了1个值,覆盖了以前设置的值,并最终采用“b040”XElement name的值,而不是“b036”的值(如果存在且exists@Dashak我认为您需要显示更多的代码来解释如何设置元素
变量。