Если вы хотите, чтобы результат был таким, каким вы его представляете, вам придется проделать немного больше работы, просто недостаточно работы с выражением linq
Сначала. измените запрос ссылки следующим образом:
var result = doc.Descendants("colors")
.SelectMany((x) => x.Elements("color").Select((c, i) => new { Id = i, Color = c.Value }));
Мы добавляем индекс к нашему классу результатов, чтобы позже его можно было использовать для сопоставления цвета с их собственным столбцом.
Далее вам понадобится чтобы преобразовать ваши данные, в противном случае все цвета будут go в одном столбце, так как каждое свойство отображается в столбец:
Я добавил несколько комментариев в приведенном ниже коде, который объясняет, что он делает.
// create a new DataTable for mapping the transformed data
var table = new DataTable();
// loop through all items to create a column for each index.
foreach (var item in result)
{
var colName = item.Id.ToString();
if (!table.Columns.Contains(colName))
{
table.Columns.Add(colName);
}
}
// loop again through the results to add each item to the right position in the datatable
foreach (var item in result)
{
var isMapped = false;
// a second foreach to check if it should go into an existing row
foreach (DataRow dataRow in table.Rows)
{
if (dataRow[item.Id.ToString()].ToString() == "")
{
dataRow[item.Id.ToString()] = item.Color;
isMapped = true; // set to true so we don't map it again later
break; // no need to continue the loop, we found where the color belongs
}
}
if (!isMapped)
{
var row = table.NewRow(); // it doesn't belong in an existing row
row[item.Id.ToString()] = item.Color;
table.Rows.Add(row);
}
}
// Assign the new table to your view
dataGridView1.DataSource = table;
Это должно сделать это. Имейте в виду, что для больших наборов данных эти циклы могут стать медленными. Возможно, существует более оптимальное решение, но оно выполнено, и теперь у вас должны быть данные, которые выглядят следующим образом:
| red | blue |
| green | yellow |