Здравствуйте, snaphold, Вы писали:
S>как из persons одним запросом через Linq получить 2 массива: ages (distinct age from persons), names (distinct name from persons) ?
Пиши свой метод. Linq — это про другое.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, snaphold, Вы писали:
S>как из persons одним запросом через Linq получить 2 массива: ages (distinct age from persons), names (distinct name from persons) ?
Впрочем, в качестве бреда:
var list = new List<(string name, int age)> { ("1", 2), ("3", 4) };
var data = list.Aggregate(
(names : new HashSet<string>(), ages : new HashSet<int>()),
(seed, item) =>
{
seed.names.Add(item.name);
seed.ages. Add(item.age);
return seed;
});
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, snaphold, Вы писали:
S>как из persons одним запросом через Linq получить 2 массива: ages (distinct age from persons), names (distinct name from persons) ?
Никак, это задача не для одного запроса. Как вариант для одного ПРОХОДА — да, можно безо всяких LINQ тупо пройтись циклом.
Здравствуйте, snaphold, Вы писали:
S>Person S> age S> name
S>как из persons одним запросом через Linq получить 2 массива: ages (distinct age from persons), names (distinct name from persons) ?
А если сначала получить distinct-сочетания (age,name), а затем из них выдрать индивидуальные distinct-списки? Это не спасёт отца русской демократии?
Здравствуйте, Mr.Delphist, Вы писали:
MD>Здравствуйте, snaphold, Вы писали:
S>>Person S>> age S>> name
S>>как из persons одним запросом через Linq получить 2 массива: ages (distinct age from persons), names (distinct name from persons) ?
MD>А если сначала получить distinct-сочетания (age,name), а затем из них выдрать индивидуальные distinct-списки? Это не спасёт отца русской демократии?
у меня было ощущение что SelectMany может решить мою проблему. Я его редко юзаю и поэтому в любых непонятных случаях считаю что он умеет это)
Здравствуйте, snaphold, Вы писали:
S>Есть такой массив.
S>List<Person> persons
S>Person S> age S> name
S>как из persons одним запросом через Linq получить 2 массива: ages (distinct age from persons), names (distinct name from persons) ?
S>то есть хотелось бы такого вида получить S>
Здравствуйте, vaa, Вы писали:
vaa>но раз нет в стандратной библиотеке, думаю там есть подвох
Если чего-то нет не обязательно есть на это причины
Конкретно здесь объективная причина это множественный проход по перечислению.
Методы расширения LINQ построены на реализацию в один проход.
IEnumerable<IEnumerable<T>> Transpose1<T>(IEnumerable<IEnumerable<T>> list) {
return
list.First().Any()
// generate list of heads of lists | 'concat' it with the rest of the matrix transposed
? (new []{list.Select(x => x.First())}).Concat(Transpose1(list.Select(x => x.Skip(1))))
: (IEnumerable<IEnumerable<T>>) new List<List<T>>();
}
Здравствуйте, snaphold, Вы писали:
S>как из persons одним запросом через Linq получить 2 массива: ages (distinct age from persons), names (distinct name from persons) ?
А зачем вам 1 запросом? Чем не устраивает 2?
(names, ages) = ((from p in persons select p.name).Distinct(), (from p in persons select p.age).Distinct());
То есть начинаем с пустого множества, а затем каждый из элементов исходной коллекции складываем в это множество (игнорируя дубликаты).
С учётом этого знания, решение от IT выглядит очевидным обобщением: