LINQ Рефакторинг - PullRequest
       10

LINQ Рефакторинг

1 голос
/ 04 мая 2009

Я переделал свой цикл foreach из этого ранее:

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)));

Ответы [ 3 ]

3 голосов
/ 04 мая 2009

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

        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);
        }
2 голосов
/ 04 мая 2009

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

selected.ForEach(x => 
          { 
             mainNode.SetAttribute("name", x.Key);
             mainNode.SetAttribute("value", x.Value);
          });
0 голосов
/ 05 мая 2009

Есть ли шанс, что вы сможете перейти с 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 и друзья.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...