Как читать XML-файл с помощью LINQ в C # - PullRequest
1 голос
/ 24 декабря 2010

У меня есть XML-файл типа

<root>
  <Child val1="1" val2="2"/>
  <Child val1="3" val2="4"/>
  <Child val1="5" val2="6"/>
  <Child val1="7" val2="8"/>
  <Child val1="9" val2="10"/>
  <Child val1="11" val2="12"/>
  <Child val1="13" val2="14"/>
</root>

Мне нужно прочитать значения атрибутов val1 и val2 до List<String>

результирующий список будет содержать

{ "1" , "2" , "3" , ........ ,"13" , "14" }

Вот мой пример кода:

XDocument XD = XDocument.Load(Application.StartupPath + "\\foo.xml");
List<String> l_lstTemp = XD.Descendants("Child")
                           .Select(X => new List<String> { X.Attribute("val1").Value,
                                                           X.Attribute("val2").Value })
                           .SelectMany(X => X)
                           .Distinct()
                           .ToList();

есть ли способ сделать это, используя Select вместо selectMany?

Как изменить мои существующие expression?

Ответы [ 2 ]

3 голосов
/ 24 декабря 2010

SelectMany делает именно то, что вам нужно - это сводит результат из последовательности списков строк в одну последовательность строк. Почему вы хотите взять рабочий код, который точно выражает то, что вам нужно, и изменить его?

По общему признанию, вы можете несколько упростить его, используя SelectMany немного по-другому, и используя массив вместо списка, чтобы тоже немного сократить вещи: *

XDocument doc = XDocument.Load(Application.StartupPath + "\\foo.xml");
List<String> values = doc.Descendants("Child")
                         .SelectMany(x => new[] { x.Attribute("val1").Value,
                                                  x.Attribute("val2").Value })
                         .Distinct()
                         .ToList();
0 голосов
/ 24 декабря 2010

Ваш проблемный сценарий - это именно то, для чего существует SelectMany, поэтому я думаю, что все, что мы могли бы попытаться сделать, чтобы устранить его, просто усложнит ситуацию.:)

Исходный .Select возвращает результат IEnumerable, и без .SelectMany мы получим:

{
 IEnumerable<string> [ "1", "2" ]
 IEnumerable<string> [ "3", "4" ]
 etc...
}

.SelectMany принимает IEnumerable, который «сведет» исходные результаты веще один IEnumerable оставляя вас с тем, что вы хотите:

{
 IEnumerable<string> [ "1", "2", "3", "4" ]
}

Вот отличный пост с гораздо лучшим описанием Визуальный взгляд на оператор LINQ SelectMany .

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