Как сгруппировать элементы из коллекции с помощью LINQ и вернуть фасонные данные в соответствии с типом коллекции - PullRequest
1 голос
/ 27 декабря 2010

У меня есть следующая коллекция

public IQueryable<myObjectType > GetWorkCellLoadGraphDataByIdDummy()
    {
       IList<myObjectType> workCellLoadGraphDataCollection = new List<myObject>()
            { 
                new myObjectType(DateTime.Today.AddHours(8).AddMinutes(30), 1),
                new myObjectType(DateTime.Today.AddHours(10).AddMinutes( 10 ), 6 ),
                new myObjectType(DateTime.Today.AddHours(13).AddMinutes( 30 ),8 ),

                new myObjectType(DateTime.Today.AddDays(1).AddHours(8).AddMinutes(30), 1),
                new myObjectType(DateTime.Today.AddDays(1).AddHours( 10 ).AddMinutes( 10 ), 5 ),
                new myObjectType(DateTime.Today.AddDays(1).AddHours( 13 ).AddMinutes( 30 ), 2 )
            };


        // Write some LINQ code to group data according to first parameter
        // Perform sum of last parameter
        // Shape the data to be in the form of myObjectType 

        // return result;
    }

, и я хочу сгруппировать элементы по первому параметру класса myObjectType.

Тогда для каждой группировки я бы хотел сделать сумму всех последних параметров.

Наконец, результат должен быть возвращен в виде "myObjectType"

Я знаю, как это сделать по старинке, т.е. перебирать все элементы и делать суммы.Тем не менее, я хотел бы узнать, как это сделать в LINQ, что я только начал.

Может ли кто-нибудь указать мне правильное направление, чтобы я мог перевести свои требования в LINQ?

По сути, результатом должна быть коллекция, содержащая два объекта типа myObjectType следующим образом:

  • Первый объект в коллекции: (DateTime.Today, 15)
  • Второй объект в коллекции: (DateTime.Today.AddDays (1), 8)

TIA,

Дэвид

1 Ответ

3 голосов
/ 27 декабря 2010

Учитывая класс с этим базовым дизайном

class MyObjectType
{
    public MyObjectType(DateTime date, int count)
    {
        this.MyDate = date;
        this.MyCount = count;
    }

    public DateTime MyDate { get; set; }
    public int MyCount { get; set; }
}

Вы можете выполнить свое требование, используя LINQ, как описано ниже.В первом примере создается IEnumerable<MyObjectType> с использованием синтаксиса беглого метода расширения.

var query = collection.GroupBy(obj => obj.MyDate.Date)
                      .Select(grp =>
                                new MyObjectType(grp.Key, grp.Sum(obj => obj.MyCount))
                             );

Во второй версии достигается тот же результат, но используется более синтаксис выражения запроса SQL-esque.

var query = from obj in collection
            group obj by obj.MyDate.Date into grp
            let mySum = grp.Sum(item => item.MyCount)
            select new MyObjectType(grp.Key, mySum);

Fromтам вы используете методы расширения AsQueryable, чтобы получить результат IQueryable, или ToList() / ToArray(), чтобы получить конкретные коллекции.

...