C # Linq - SET синтаксис из SQL, т.е. SET abc (свойство obj), ГДЕ xyz = true в IEnumerable <obj> - PullRequest
3 голосов
/ 21 октября 2010

У меня есть коллекция объектов Obj, я хочу просмотреть коллекцию и установить свойство, если условие выполняется, поэтому в обычном мире это будет:

foreach (var o in obj)
{
   if (o.SomeProperty == Something)
   {
      o.SomeOtherProperty = true;
   }
}

В любом случае, чтобы сделать это, используя Linq, чтобы сделать это в одну строку?

Ответы [ 3 ]

5 голосов
/ 21 октября 2010

LINQ не так уж полезен для выполнения побочных эффектов, он в первую очередь предназначен для запросов .По правде говоря, тот факт, что его отложенное выполнение настолько укоренилось в его поведении, делает его плохим выбором для выполнения побочных эффектов, IMO.

Код, который вы получаете, выглядит прекрасномне.Если вы действительно хотели использовать LINQ, я сомневаюсь, что вы могли бы значительно улучшить:

foreach (var o in obj.Where(i => i.SomeProperty == Something))
{
   o.SomeOtherProperty = true;
}  

Теперь, это не так уж и лучше (возможно, хуже), чем ваш оригинал.

Вкл.с другой стороны, если вы хотите создать новую, последовательность потоков с проекциями исходных элементов, имеющих желаемые характеристики, вы можете сделать что-то вроде:

var projection = obj.Where(i => i.SomeProperty == Something)
                    .Select(i => new Foo(i) { SomeOtherProperty = true });
                    // assuming your type has a copy-constructor

РЕДАКТИРОВАТЬ : Если вы не хотите прислушиваться к советам экспертов (читай: Эрик Липперт), вы можете написать свой собственный метод расширения:

public static void Do<T>(this IEnumerable<T> source, Action<T> action)
{ 
  if (source == null)
     throw new ArgumentNullException("source");

  if (action == null)
     throw new ArgumentNullException("action");

  foreach (T item in source) 
     action(item);
}

Это будетпозволяют сделать:

obj.Where(o => o.SomeProperty == Something)
   .Do(o => o.SomeOtherProperty = true);
3 голосов
/ 21 октября 2010
obj.Where(i => i.SomeProperty == Something).ToList().ForEach(o => o.SomeOtherProperty = true);  
1 голос
/ 21 октября 2010

Использование метода расширения:

public static int UpdateOnPredication<T>(this IEnumerable<T> source, Func<T, bool> predicate, Action<T> update)
{
    //check the parameters here if (source==null) ...
    var query = source.Where(predicate);
    foreach (var item in query)
    {
        update(item);
    }
    return query.Count();
}

Использование:

results.UpdateOnPredication(x => x.ID > 1000, x => x.Status = 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...