Я хотел бы знать, как использовать SelectMany()
. кажется, что так много аргументов, и из моего собственного исследования я заметил, что selectmany
может быть «отцом» всех других операций выбора.Различные способы использования SelectMany()
ответ
Выберите много позволяет выбрать свойство из источника запроса, который является IEnumerable <T> коллекции, но вместо того, чтобы возвращать коллекцию коллекций (IEnumerable < IEnumerable <T> >) будет сглаживать коллекции в единый коллекция.
Вот пример, который вы можете запустить, чтобы продемонстрировать разницу между Select и SelectMany:
//set up some data for our example
var tuple1 = new { Name = "Tuple1", Values = new int [] { 1, 2, 3 } };
var tuple2 = new { Name = "Tuple2", Values = new int [] { 4, 5, 6 } };
var tuple3 = new { Name = "Tuple3", Values = new int [] { 7, 8, 9 } };
//put the tuples into a collection
var tuples = new [] { tuple1, tuple2, tuple3 };
//"tupleValues" is an IEnumerable<IEnumerable<int>> that contains { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }
var tupleValues = tuples.Select(t => t.Values);
//"tupleSelectManyValues" is an IEnumerable<int> that contains { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
var tupleSelectManyValues = tuples.SelectMany(t => t.Values);
С помощью SelectMany вы сделать его проще для запроса значений в дочерних коллекций.
SelectMany основном сглаживается и обрабатывает иерархические данные, и имеет две основных форм
(для целей примера, см этого исходного кода)
class TestObj
{
public string Name { get; set; }
public List<string> Items { get; set; }
}
var hierarchicalCollection = new List<TestObj>();
hierarchicalCollection.Add(new TestObj()
{Items = new List<string>()
{"testObj1-Item1", "testObj1-Item2"}, Name="t1"});
hierarchicalCollection.Add(new TestObj()
{Items = new List<string>()
{"testObj2-Item1", "testObj2-Item2"}, Name="t2"});
вариант 1) создает коллекцию из коллекции коллекции (по существу, сплющивание иерархических данных)
IEnumerable<string> flattenedCollection =
hierarchicalCollection.SelectMany(t => t.Items);
В результате получается:
"testObj1-Item1"
"testObj1-Item2"
"testObj2-Item1"
"testObj2-Item2"
вариант 2) создает коллекцию из коллекции коллекций, а затем обрабатывает каждый элемент новой коллекции с помощью ссылки на оригинальный родителю
IEnumerable<string> flattenedModifiedCollection =
hierarchicalCollection.SelectMany
(t => t.Items, (t, i) => t.Name + " : " + i);
результат:
"t1 : testObj1-Item1"
"t1 : testObj1-Item2"
"t2 : testObj2-Item1"
"t2 : testObj2-Item2"
, каждое из указанных выше вариантов использования имеет вариант, в котором индекс обрабатываемого элемента доступен для функций преобразования.
Я использую это расширение все время для погружения в иерархии.
Еще один крутой способ сделать это, когда Extensions получить немного неаккуратно, чтобы использовать формальный способ LINQ, как:
var vehicles = from cust in context.Customers
from fleet in cust.Fleets
from v in fleet.Vehicles
select v;
Это было бы эквивалентно:
var vehicles = context.Customers.SelectMany(c => c.Fleets).SelectMany(f => f.Vehicles);
Это может получить немного длиннее намотки при добавлении туда, где предложения и объединения и т. д. Надеюсь, это поможет!
У меня было некоторое удовольствие, используя SelectMany в LINQ. Следующая ссылка описала возвращение IEnumerable в предложение select LINQ, которое возвращает последовательность последовательностей и использование SelectMany, чтобы сгладить это в простую последовательность. "Linq to XML using Let, Yield return and Selectmany". Это не только вариант использования SelectMany, но и часть подхода, который генерирует несколько выходов с одного входа в LINQ.
Есть несколько перегрузок в SelectMany
. Один из них позволяет вам отслеживать любые отношения между родителем и детьми при обходе иерархии.
Пример: предположим, что вы имеете следующую структуру: League -> Teams -> Player
Вы можете легко вернуть плоский сбор игроков. Однако вы можете потерять любую ссылку на команду, частью которой является игрок.
К счастью, есть перегрузка для такой цели:
var teamsAndTheirLeagues =
from helper in leagues.SelectMany
(l => l.Teams
, (league, team) => new { league, team })
where helper.team.Players.Count > 2
&& helper.league.Teams.Count < 10
select new
{ LeagueID = helper.league.ID
, Team = helper.team
};
Предыдущий пример взят из IK блога Дэна:
http://blogs.interknowlogy.com/2008/10/10/use-linqs-selectmany-method-to-flatten-collections/
Я сильно рекомендую вам взглянуть на него ,
Вот еще один пример (VB.NET) использование:
'Original list
Dim l() As String = {"/d", "/bc:\Temp\In*;c:\Temp\Out", "/hABC", "/s123"}
'Processed list: will list first 2 characters from each string member.
Dim L1 As IEnumerable(Of String) = l.SelectMany(Function(x As String) {x.Substring(0, 2)})
Dim L2 As List(Of String) = l.SelectMany(Function(x As String) {x.Substring(0, 2)}).ToList
'Will return dictionary like list with keys==2 characters and values the rest from each string member.
Dim L3 As List(Of KeyValuePair(Of String, String)) = l.SelectMany(Function(x As String) {New KeyValuePair(Of String, String)(x.Substring(0, 2), x.Substring(2))}).ToList
- 1. Различные способы использования WCF
- 2. Различные способы использования конструкторов C++
- 3. Различные способы использования использования в C#
- 4. Каковы различные способы использования веб-службы
- 5. Различные способы использования assert в Groovy
- 6. Различные способы использования __init__ для PyQt4
- 7. различные способы использования экспресс промежуточного программного
- 8. Различные способы использования переменной в разных подпрограммах
- 9. Каковы различные способы использования каталогов в Windows?
- 10. Различные способы использования заявлений на импорт
- 11. Каковы различные способы использования уязвимости XSS?
- 12. Различные способы создания div
- 13. Различные способы перечисления коллекции
- 14. Android - Различные способы воспроизведения видео
- 15. Различные способы инициализации одиночек
- 16. Различные способы сделать строку?
- 17. Каковы различные способы инициализации
- 18. Различные способы расчета числа
- 19. Различные способы создания классов?
- 20. Различные способы сравнения строк
- 21. Различные способы выполнения IIFE?
- 22. Различные способы импорта
- 23. различные способы String Присоединиться
- 24. Различные способы инициализации переменной
- 25. Различные способы объявления переменных?
- 26. Различные способы привести объект
- 27. Различные способы копирования ArrayList
- 28. различные способы добавления фрагмента
- 29. Различные способы сделать переадресацию
- 30. различные способы расчета треугольника
Благодаря abatishchev, я не заметил опечатку. –