C# 如何使用.NET3.5/C简化此代码#

C# 如何使用.NET3.5/C简化此代码#,c#,.net,linq,.net-3.5,C#,.net,Linq,.net 3.5,我在C#和.NET3.5中有以下代码,运行良好,但需要知道是否可以简化,可能是使用Linq还是其他什么?基本上,我是在读取一个xml文件来获取列名。然后尝试复制dictionary对象中的列和序列属性,如果“isactive attribute of the column为”true“。我在代码的其他部分使用此dictionary对象。我循环遍历元素,然后遍历属性并查找活动的列,如果活动,则存储序列,最后将列和序列添加到字典中 var doc = XDocument.Load("DataStru

我在
C#和.NET3.5
中有以下代码,运行良好,但需要知道是否可以简化,可能是使用Linq还是其他什么?基本上,我是在读取一个xml文件来获取列名。然后尝试复制dictionary对象中的列和序列属性,如果“isactive attribute of the column为”true“。我在代码的其他部分使用此dictionary对象。我循环遍历元素,然后遍历属性并查找活动的列,如果活动,则存储序列,最后将列和序列添加到字典中

var doc = XDocument.Load("DataStructure.xml");
var cols = doc.XPathSelectElements("/datastructure/" + sPageName + "/columns");
Dictionary<string, int> columns = new Dictionary<string, int>();
bool bAddData = true;
int sSequence = 0;

foreach (var col in cols.Elements())
{
    foreach (XAttribute at in col.Attributes())
    {
        if (at.Name.ToString().ToLower().Equals("isactive") && at.Value.ToString() != "true")
        {
            bAddData = false;
            break;
        }

        bAddData = true;                    
        if (at.Name.ToString().ToLower().Equals("sequence"))
        {
            sSequence = Convert.ToInt32(at.Value.ToString());
            break;
        }
    }
    if (bAddData)
    {
        columns.Add(col.Name.ToString(), sSequence);
    }
}
var doc=XDocument.Load(“DataStructure.xml”);
var cols=doc.XPathSelectElements(“/datastructure/”+sPageName+“/columns”);
字典列=新字典();
bool-baddata=true;
int序列=0;
foreach(cols.Elements()中的var col)
{
foreach(列属性()中的XAttribute)
{
if(at.Name.ToString().ToLower().Equals(“isactive”)&&at.Value.ToString()!=“true”)
{
Baddata=假;
打破
}
Baddata=true;
if(at.Name.ToString().ToLower().Equals(“序列”))
{
sSequence=Convert.ToInt32(at.Value.ToString());
打破
}
}
如果(Baddata)
{
columns.Add(col.Name.ToString(),sSequence);
}
}
我确信这是一个非常糟糕的代码,但我想知道如何改进它。这是xml数据文件。如果我需要重新构造xml使之变得简单,我可以

<?xml version="1.0" encoding="utf-8" ?>
<datastructure>
  <MyPage>
    <columns>
      <number isactive="true" sequence="1" />
      <curr_code isactive="true" sequence="2" />
      <curr_desc isactive="true" sequence="3" />
      <tradecurrvalue isactive="true" sequence="4" />
      <selectcurrvalue isactive="true" sequence="5" />
    </columns>    
  </MyPage>
</datastructure>

您可以尝试类似的方法

cols.Elements().Where(
                e =>
                    {
                        var attribute = e.Attribute("isactive");
                        return attribute != null &&
                               attribute.Value.ToString().Equals("true", StringComparison.CurrentCultureIgnoreCase);
                    })
                .ToDictionary(e => e.Name.ToString(),
                              e => Convert.ToInt32(e.Attribute("sequence").Value.ToString()));

你可以试试这样的

cols.Elements().Where(
                e =>
                    {
                        var attribute = e.Attribute("isactive");
                        return attribute != null &&
                               attribute.Value.ToString().Equals("true", StringComparison.CurrentCultureIgnoreCase);
                    })
                .ToDictionary(e => e.Name.ToString(),
                              e => Convert.ToInt32(e.Attribute("sequence").Value.ToString()));

我认为这应该做到:

var doc = XDocument.Load("DataStructure.xml");
var cols = doc.XPathSelectElements("/datastructure/" + sPageName + "/columns");

Dictionary<string, int> columns =
  cols.Elements()
  .Where(c => c.Attribute("isactive").Value == "true")
  .ToDictionary(
    c => c.Name.ToString(),
    c => Int32.Parse(c.Attribute("sequence").Value)
  );

我认为这应该做到:

var doc = XDocument.Load("DataStructure.xml");
var cols = doc.XPathSelectElements("/datastructure/" + sPageName + "/columns");

Dictionary<string, int> columns =
  cols.Elements()
  .Where(c => c.Attribute("isactive").Value == "true")
  .ToDictionary(
    c => c.Name.ToString(),
    c => Int32.Parse(c.Attribute("sequence").Value)
  );


为什么?您已经有了“比LINQ更快”版本的代码。@BoltClock,C#3.5。我认为我没有充分利用C#3.5。@chief先生,我认为LINQ可以简化,但可能会更慢、更不灵活。我说的对吗?@user465876:C#3.5不存在。它是3.0或4.0…它可能会减少代码行数并生成更短的语法,但它确实会引入开销。最终,它会在某个时候被翻译成foreach。LINQ与lambdas的结合确实产生了优雅的代码。它更简单吗?那是主观的!为什么?您已经有了“比LINQ更快”版本的代码。@BoltClock,C#3.5。我认为我没有充分利用C#3.5。@chief先生,我认为LINQ可以简化,但可能会更慢、更不灵活。我说的对吗?@user465876:C#3.5不存在。它是3.0或4.0…它可能会减少代码行数并生成更短的语法,但它确实会引入开销。最终,它会在某个时候被翻译成foreach。LINQ与lambdas的结合确实产生了优雅的代码。它更简单吗?那是主观的!我发现这比原版难读多了。@Charles:我发现它更容易理解。我花了一段时间才弄明白原始代码在做什么。我现在也简化了一点,使用XElement中的方法来查找属性,而不是LINQ extensions.lol@Guffa。你觉得更容易理解吗?伙计,代码是你写的。“如果只是因为这个原因,我会让你觉得它很容易理解的。”@Tundey:把它写成一个查询会让它更直截了当。原始代码实际上过于复杂,因此在没有LINQ的情况下也可以使其更具可读性。我认为这是不正确的。c.Attribute(“isactive”).Value!=“true”应该是c.Attribute(“isactive”)。Value==“true”。我发现这比原始版本更难阅读。@Charles:我发现它更容易理解。我花了一段时间才弄明白原始代码在做什么。我现在也简化了一点,使用XElement中的方法来查找属性,而不是LINQ extensions.lol@Guffa。你觉得更容易理解吗?伙计,代码是你写的。“如果只是因为这个原因,我会让你觉得它很容易理解的。”@Tundey:把它写成一个查询会让它更直截了当。原始代码实际上过于复杂,因此在没有LINQ的情况下也可以使其更具可读性。我认为这是不正确的。c.Attribute(“isactive”).Value!=“true”应该是c.Attribute(“isactive”)。Value==“true”。我发现这个解决方案很简短,而且非常优雅。想知道是否有任何限制,顺便说一句,这和其他解决方案提供了上述。我不这样认为。但是,如果您的应用程序不总是具有isactive,则必须在where子句中检查它。诸如此类的东西,你可能不得不调整,使其生产准备就绪。这一切都取决于传入的xml以及所需的属性。xml是一个配置文件,并且始终具有值为/null的所有属性。我将对此解决方案给予较高的评价,但将保留此LINQ解决方案以备将来使用。我现在将使用我的代码,但是Guffa发布了一个简化版本:)谢谢Miachael抽出时间!!我发现这个解决方案很简短,非常优雅。想知道是否有任何限制,顺便说一句,这和其他解决方案提供了上述。我不这样认为。但是,如果您的应用程序不总是具有isactive,则必须在where子句中检查它。诸如此类的东西,你可能不得不调整,使其生产准备就绪。这一切都取决于传入的xml以及所需的属性。xml是一个配置文件,并且始终具有值为/null的所有属性。我将对此解决方案给予较高的评价,但将保留此LINQ解决方案以备将来使用。我现在将使用我的代码,但是Guffa发布了一个简化版本:)谢谢Miachael抽出时间@鲍登:你为什么要关心这里的
StringComparison.CurrentCultureInoRecase
?微小的速度优化值得额外的四行代码吗?只是好奇。我习惯于在多语言系统中工作。我把它放进去只是因为我习惯了这么做。@bdowden:你为什么要关心
StringComparison.CurrentCu