Используя Linq и C #, как я могу объединить два списка по некоторым критериям? - PullRequest
4 голосов
/ 13 сентября 2010

Контекст


public class Item
{
    public int Index;
    public string Text;
}

...

var items = new List<Item>
{
    new Item {Index=1, Text="Data #1"},
    new Item {Index=8, Text="Data #8"},
    new Item {Index=4, Text="Data #4"},
};

код


var data = (from item in items
           orderby item.Index
           select item).ToList();

Результат


Данные [0] = Данные # 1
Данные [1] = Данные № 4
Данные [2] = Данные № 8

Что нужно


Данные [0] = ноль
Данные [1] = Данные # 1
Данные [2] = ноль
Данные [3] = ноль
Данные [4] = Данные № 4
Данные [5] = ноль
Данные [6] = ноль
Данные [7] = ноль
Данные [8] = Данные № 8

Как этого добиться с помощью Linq?

Ответы [ 3 ]

5 голосов
/ 13 сентября 2010

Это делает то, что вы хотите:

var result = Enumerable.Range(0, items.Max(x => x.Index) + 1)
                       .Select(i => items.Where(x => x.Index == i)
                                         .Select(x => x.Text)
                                         .SingleOrDefault())
                       .ToList();

Результат:

result[0] = null
result[1] = Data #1
result[2] = null
result[3] = null
result[4] = Data #3
result[5] = null
result[6] = null
result[7] = null
result[8] = Data #8

Вы можете повысить производительность, сохранив исходные данные в словаре:

Dictionary<int, string> d = items.ToDictionary(x => x.Index, x => x.Text);
List<string> result = new List<string>();
for (int i = 0; i < d.Keys.Max() + 1; ++i)
{
    string s;
    d.TryGetValue(i, out s);
    result.Add(s);
}
4 голосов
/ 13 сентября 2010

По сути, вам нужно левое соединение между последовательностью чисел и вашим списком предметов:

var result =
    (from i in Enumerable.Range(0, items.Max(it => it.Index) + 1)
     join item in items on i equals item.Index into g
     from item in g.DefaultIfEmpty()
     select item).ToList();
4 голосов
/ 13 сентября 2010
string[] myData = new string[items.Max(item => item.Index)];

foreach(Item myItem in items)
{
    myData[myItem.Index] = myItem.Data;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...