Как создать вложенную LINQ Grouping / Lookups для коллекции объектов - PullRequest
0 голосов
/ 20 мая 2010

Учитывая список объектов с датой и десятичной дробью, я хотел бы проиндексировать эти объекты по году, месяцу, дневной неделе и часу даты.В .NET 2.0 я создал бы этот граф, используя набор вложенных словарей и список в качестве конечного узла.Меня интересует, как это можно сделать с помощью LINQ.

Ответы [ 2 ]

1 голос
/ 20 мая 2010

Предположим, у вас есть класс со свойствами DateTime и Decimal ...

public class SomeThingWithDateAndDecimal
{
    public DateTime SomeDate { get; set; }
    public decimal SomeDecimal { get;set; }
}

На вашем месте я бы создал класс для вашего ключа вот так ...

public class IndexKey
{
    public int Year { get; set; }
    public int Month { get; set; }
    public DayOfWeek DayOfWeek { get; set; }
    public int Hour { get; set; }

    public IndexKey(DateTime dt)
    {
        Year = dt.Year;
        Month = dt.Month;
        DayOfWeek = dt.DayOfWeek;
        Hour = dt.Hour;
    }

Тогда из вашего списка сделайте что-то вроде этого ...

public static void Main()
{
    var l = new List<SomeThingWithDate>();

    //Fill the list with stuff...

    var indexed = l.ToLookup(o => new IndexKey(o.SomeDate));
}

Это не вложенный, но все, что вы можете сделать с вложенными словарями, вы можете сделать с этой структурой. Некоторые вещи, которые вам трудно сделать с помощью вложенных словарей, упрощаются, например, поиск по частичному ключу, т.е. «Получить все значения с помощью Hour == 2».

1 голос
/ 20 мая 2010

Вы имеете в виду что-то подобное?

var grouping = from item in myList
               group item by new { item.Date.Year, item.Date.Month, item.Date.DayOfWeek, item.Date.Hour }
               into groupedItems
               select groupedItems;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...