Обновление списка объектов на основе ключа - LINQ - PullRequest
1 голос
/ 14 марта 2011

Это мой список объектов

List<MemObject>
                   {
                       new MemObject
                           {Serial = 1, ErrorCode = "ABC", ModifedAt = new DateTime(2011, 12, 15, 10, 10, 30)},
                       new MemObject
                           {Serial = 1, ErrorCode = "ABD", ModifedAt = new DateTime(2011, 12, 15, 10, 10, 30)},
                       new MemObject
                           {Serial = 1, ErrorCode = "ABC", ModifedAt = new DateTime(2011, 12, 15, 10, 10, 30)},
                       new MemObject
                           {Serial = 1, ErrorCode = "ABC", ModifedAt = new DateTime(2011, 12, 15, 10, 10, 30)},
                   };

Я хочу обновить поле ModifiedAt, увеличив время на одну секунду для каждых 2, 3, .. n записей, которые имеют такой же Serial, ErrorCode.

Как это можно сделать в linq.

Ответы [ 4 ]

1 голос
/ 14 марта 2011

Это обновит каждую запись ModifiedAt.Возможно, вам придется выполнить Count (...) - 1, если вы не хотите включать обновленный объект в число записей.

memObjects.ForEach(x => x.ModifiedAt.AddSeconds(memObjects.Count(y => y.Serial == x.Serial && y.ErrorCode == x.ErrorCode)));
1 голос
/ 14 марта 2011

Это настолько близко к одному оператору linq, насколько я могу получить.Это работает, хотя.

    public void IncrementTime(int serial, string errorCode)
    {
        var matchObjects = _memObjects.Where(x => x.Serial == serial && x.ErrorCode == errorCode).ToList();

        matchObjects.ForEach(x => x.ModifedAt = x.ModifedAt.AddSeconds(
                                    matchObjects.Count(y => matchObjects.IndexOf(y) < matchObjects.IndexOf(x))
                             ));
    }
0 голосов
/ 14 марта 2011

LINQ вам здесь не поможет.Он предназначен не для обновления коллекций, а для их поиска.Вы не должны ожидать больше от этого.При правильном использовании вы можете группировать товары и обновлять их в соответствии с вашими требованиями.

// group the MemObjects by Serial and ErrorCode that has more than 1 occurrences
var query = list.GroupBy(mo => new { mo.Serial, mo.ErrorCode })
                //.Where(g => g.Count() > 1); // O(n)
                .Where(g => g.Skip(1).Any()); // O(1)

// make the updates
foreach (var group in query)
{
    int i = 1;
    foreach (var mo in group)
    {
        mo.ModifedAt += TimeSpan.FromSeconds(i++);
    }
}
0 голосов
/ 14 марта 2011

Что-то вроде этого, возможно?

public void IncrementTime(int serial, string errorCode)
{
    _memObjects.Where(x => x.Serial == serial && x.errorCode == errorCode)
        .ToList()
        .ForEach(x => x.ModifiedAt = x.ModifiedAt.Add(new TimeSpan(0, 0, 1)));
}
...