Весь If prevValue! = CurrValue вещь в цикле - PullRequest
2 голосов
/ 20 марта 2009

Скажем, у нас есть список {a, a, a, b, b, c, c}

Мы хотим перебрать список и внести какие-то изменения при изменении значения элемента ... например:

prevEmployer = String.empty;
foreach(Person p in PersonList){
  if(p.Employer != prevEmployer){ 
    doSomething(); 
    prevEmployer = p.Employer;
  }
  ... more code
}

Есть ли альтернатива этому? Мне это кажется просто грязным.

Редактирование: сделал код более реалистичным для рассматриваемой проблемы.

Ответы [ 4 ]

5 голосов
/ 20 марта 2009

Хотите отличные значения? т.е. когда-нибудь будет {a, a, a, b, b, a, c, c, a}? Если нет, вы можете использовать LINQ:

foreach(string s in theList.Distinct()) {
   doSomething(); // with s
}

Re ваше обновление; возможно использовать что-то вроде DistinctBy:

foreach(var item in data.DistinctBy(x=>x.Foo)) {
    Console.WriteLine(item.Bar);
}

public static IEnumerable<TSource> DistinctBy<TSource,TValue>(
        this IEnumerable<TSource> source, Func<TSource,TValue> selector) {
    var set = new HashSet<TValue>();
    foreach (var item in source) {
        if (set.Add(selector(item))) {
            yield return item;
        }
    }
}
3 голосов
/ 20 марта 2009

Это действительно зависит от того, что вы пытаетесь сделать с остальной частью кода. @Marc Gravell отвечает правильно, если вам нужно только выполнить действие для каждого отдельного элемента в списке, однако, если doSomething () просто устанавливает какое-то состояние на основе того факта, что элемент списка изменился, и вы работаете с каждым элементом в список (или нужны отдельные элементы для другой цели), тогда ваш метод кажется вполне разумным.

0 голосов
/ 21 марта 2009

Я решил воспользоваться следующим решением, которое намного красивее, но приводит к большему количеству вызовов БД.

foreach(Employer employer in EmployerList){
  ProcessEmployees(employer);
}

ProcessEmployees(Employer employer){
  EmployeeList = GetEmployees(employer);
  foreach(Employee employee in EmployeeList){
    doStuff...
  }
}

Поэтому вместо того, чтобы начинать с {a, a, a, b, b, c, c}, я буду обрабатывать {a, a, a} {b, b} {c, c}

0 голосов
/ 20 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...