Обновить все объекты в коллекции с помощью LINQ

Я получал строки с датами, такие как hhmmss, которые пересекали последовательную линию от моего Arduino.

, так что предположим, что я получил s = "122041"; это 12:20:41, однако 9am будет 090000.

Оператор print "%d" % (s) вызывает ошибку времени выполнения, потому что 9 не является восьмеричным числом и, следовательно, является незаконным символом.

Чтобы устранить эту проблему:

print "%06d" % (int(s))

Надеюсь, что помогает

442
задан Peter Mortensen 28 April 2016 в 11:30
поделиться

10 ответов

В то время как можно использовать ForEach дополнительный метод, если Вы хотите использовать просто платформу, можно сделать

collection.Select(c => {c.PropertyToSet = value; return c;}).ToList();

Эти ToList, необходим для оценки выбора сразу из-за отложенные вычисления .

771
ответ дан Amirhossein Mehrvarzi 28 April 2016 в 21:30
поделиться
  • 1
    Анонимный downvoter - какие-либо причины? – EboMike 6 May 2011 в 20:03

Я предполагаю, что Вы хотите изменить значения в запросе, таким образом, Вы могли записать функцию для него

void DoStuff()
{
    Func<string, Foo, bool> test = (y, x) => { x.Bar = y; return true; };
    List<Foo> mylist = new List<Foo>();
    var v = from x in mylist
            where test("value", x)
            select x;
}

class Foo
{
    string Bar { get; set; }
}

, Но не Shure, если это - то, что Вы имеете в виду.

0
ответ дан Stormenet 28 April 2016 в 21:30
поделиться

Мои 2 pennies:-

 collection.Count(v => (v.PropertyToUpdate = newValue) == null);
3
ответ дан AnthonyWJones 28 April 2016 в 21:30
поделиться

Можно использовать LINQ, чтобы преобразовать набор в массив и затем вызвать Array. ForEach ():

Array.ForEach(MyCollection.ToArray(), item=>item.DoSomeStuff());

, Очевидно, это не будет работать с наборами структур или встроенных типов как целые числа или строки.

2
ответ дан Tamas Czinege 28 April 2016 в 21:30
поделиться

Нет, LINQ не поддерживает способ массового обновления. Только короче путь состоял бы в том, чтобы использовать ForEach дополнительный метод - , Почему нет никакого метода расширения ForEach на IEnumerable?

3
ответ дан Community 28 April 2016 в 21:30
поделиться

Я на самом деле нашел дополнительный метод , который сделает то, что я хочу приятно

public static IEnumerable<T> ForEach<T>(
    this IEnumerable<T> source,
    Action<T> act)
{
    foreach (T element in source) act(element);
    return source;
}
25
ответ дан lomaxx 28 April 2016 в 21:30
поделиться

Нет никакого встроенного дополнительного метода, чтобы сделать это. Хотя определяя каждый является довольно прямым. В нижней части сообщения метод, который я определил названный, Выполняют итерации. Это может использоваться как так

collection.Iterate(c => { c.PropertyToSet = value;} );

, Выполняют итерации Источника

public static void Iterate<T>(this IEnumerable<T> enumerable, Action<T> callback)
{
    if (enumerable == null)
    {
        throw new ArgumentNullException("enumerable");
    }

    IterateHelper(enumerable, (x, i) => callback(x));
}

public static void Iterate<T>(this IEnumerable<T> enumerable, Action<T,int> callback)
{
    if (enumerable == null)
    {
        throw new ArgumentNullException("enumerable");
    }

    IterateHelper(enumerable, callback);
}

private static void IterateHelper<T>(this IEnumerable<T> enumerable, Action<T,int> callback)
{
    int count = 0;
    foreach (var cur in enumerable)
    {
        callback(cur, count);
        count++;
    }
}
6
ответ дан JaredPar 28 April 2016 в 21:30
поделиться
  • 1
    Спасибо у меня было подозрение, будет способом сделать это в гуаве. – Paul Taylor 19 October 2012 в 06:43

Вы можете использовать Magiq , платформу пакетных операций для LINQ.

1
ответ дан 22 November 2019 в 22:57
поделиться

Вот метод расширения, который я использую ...

    /// <summary>
    /// Executes an Update statement block on all elements in an  IEnumerable of T
    /// sequence.
    /// </summary>
    /// <typeparam name="TSource">The source element type.</typeparam>
    /// <param name="source">The source sequence.</param>
    /// <param name="action">The action method to execute for each element.</param>
    /// <returns>The number of records affected.</returns>
    public static int Update<TSource>(this IEnumerable<TSource> source, Func<TSource> action)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (action == null) throw new ArgumentNullException("action");
        if (typeof (TSource).IsValueType)
            throw new NotSupportedException("value type elements are not supported by update.");

        var count = 0;
        foreach (var element in source)
        {
            action(element);
            count++;
        }
        return count;
    }
1
ответ дан 22 November 2019 в 22:57
поделиться

Я пробовал несколько вариантов этого и продолжаю возвращаться к решению этого парня.

http://www.hookedonlinq.com/UpdateOperator.ashx

Опять же, это чужое решение. Но я скомпилировал код в небольшую библиотеку и довольно регулярно использую ее.

Я собираюсь вставить сюда его код на случай, если его сайт (блог) перестанет существовать в какой-то момент в будущем. (Нет ничего хуже, чем увидеть сообщение «Вот точный ответ, который тебе нужен», «Нажмите» и «Мертвый URL».)

    public static class UpdateExtensions {

    public delegate void Func<TArg0>(TArg0 element);

    /// <summary>
    /// Executes an Update statement block on all elements in an IEnumerable<T> sequence.
    /// </summary>
    /// <typeparam name="TSource">The source element type.</typeparam>
    /// <param name="source">The source sequence.</param>
    /// <param name="update">The update statement to execute for each element.</param>
    /// <returns>The numer of records affected.</returns>
    public static int Update<TSource>(this IEnumerable<TSource> source, Func<TSource> update)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (update == null) throw new ArgumentNullException("update");
        if (typeof(TSource).IsValueType)
            throw new NotSupportedException("value type elements are not supported by update.");

        int count = 0;
        foreach (TSource element in source)
        {
            update(element);
            count++;
        }
        return count;
    }
}



int count = drawingObjects
        .Where(d => d.IsSelected && d.Color == Colors.Blue)
        .Update(e => { e.Color = Color.Red; e.Selected = false; } );
6
ответ дан 22 November 2019 в 22:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: