2009-05-04 2 views
1

Я переработан мой цикл Еогеасп от этого раньше:LINQ Рефакторинг

foreach (KeyValuePair[string, string] param in paramsList) 
{ 
    XmlElement mainNode = xmlDoc.CreateElement("parameter"); 
    mainNode.SetAttribute("name", param.Key); 
    mainNode.SetAttribute("value", param.Value); 
    rootNode.AppendChild(mainNode); 
} 

к этому, с помощью LINQ:

XmlElement mainNode = xmlDoc.CreateElement("parameter"); 
var selected = paramsList.AsEnumerable().Select(param => param).ToList(); 
selected.ForEach(x => (mainNode.SetAttribute("name", x.Key))); 
selected.ForEach(x => (mainNode.SetAttribute("value", x.Value))); 
rootNode.AppendChild(mainNode); 

Однако, я знаю, что ниже раздел все еще может быть переработана в единый контур, но Я не знаю, как это сделать. пожалуйста, просветите меня.

selected.ForEach(x => (mainNode.SetAttribute("name", x.Key))); 
selected.ForEach(x => (mainNode.SetAttribute("value", x.Value))); 
+0

Не имеется: Выбрать (param => param) redundant? –

+0

Кроме того, ваш исходный код будет содержать столько элементов «параметра», что в элементе paramsList есть элементы, в то время как реорганизованный код всегда будет генерировать ровно один элемент «parameter» с атрибутами «name» и «value», заданными длиной (paramsList) раз на нем. Я не думаю, что вы его правильно отредактировали. –

+0

Да, вы абсолютно правы. в любом случае, я просто прокомментировал код bruno conde и теперь id скорее не заменяет мой существующий цикл foreach. – grayman

ответ

3

Я думаю, что вы можете достичь тех же результатов с:

 paramsList.ToList().ForEach(e => { 
      XmlElement mainNode = xmlDoc.CreateElement("parameter"); 
      mainNode.SetAttribute("name", e.Key); 
      mainNode.SetAttribute("value", e.Value); 
      rootNode.AppendChild(mainNode); 
     }); 

, но в этом случае, я бы выбрал простой foreach:

 foreach (var e in paramsList) 
     { 
      XmlElement mainNode = xmlDoc.CreateElement("parameter"); 
      mainNode.SetAttribute("name", e.Key); 
      mainNode.SetAttribute("value", e.Value); 
      rootNode.AppendChild(mainNode); 
     } 
+0

я вижу .. так что вы уже могли это сделать. Увидев ваш код, я решил выбрать простой цикл foreach. Это потому, что по сравнению с простым циклом foreach я больше не буду обременять свой код, чтобы создать Generic.List , а также больше не будет делегировать. Спасибо! – grayman

2

может быть что-то вроде этого

selected.ForEach(x => 
      { 
      mainNode.SetAttribute("name", x.Key); 
      mainNode.SetAttribute("value", x.Value); 
      }); 
0

Если у вас есть возможность переключиться с XmlDocument на XDocument? LINQ to XML лучше интегрируется с LINQ, как и следовало ожидать.

var nodes = from pair in paramsList 
      select new XElement("parameter", 
           new XAttribute("name", pair.Key), 
           new XAttribute("value", pair.Value)); 

И это все, для добавления узлов в документе, или передавать их в конструктор XDocument или что-то кроме.

Редактировать: Чтобы уточнить, ваш вопрос помечен как «linqtoxml», но LINQ to XML подразумевает определенный набор классов в пространстве имен System.Xml.Linq, таком как XDocument, XElement и XAttribute. В вашем примере кода не используются какие-либо реальные классы LINQ to XML, и я предлагаю, чтобы, если вы хотите использовать LINQ для создания своего XML, фактические классы LINQ to XML будут служить вам лучше, чем XmlDocument и друзей.

 Смежные вопросы

  • Нет связанных вопросов^_^