2009-03-20 14 views
2

でprevValue!= currValue事は、我々がリストを持っている{、、、B、B、C、C}ループ全体

我々はリストをループにしたいとのいくつかの種類を作ると言うなら項目値が変更されたときに変更します。たとえば、

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

これには代替手段がありますか?それはちょうど私にクールジーに見えます。

編集:コードを手元の問題にもっと現実的にしました。

答えて

3

これは実際には、残りのコードで何をしようとしているかによって異なります。 doSomething()がリスト要素が変更されたという事実に基づいていくつかの状態を設定するだけで、リスト内の各要素に対して操作を実行している場合、@Marc Gravellの応答は正しいです。リスト(または別の目的のために個々の要素を必要とする)、あなたのメソッドは完全に妥当と思われる。

+0

私はアクションを実行する必要がありますオブジェクトの特定のプロパティが変更されたときに何かを再初期化する必要があります。結局のところシンプルでクールジーな方法がベストかもしれないと思います。 – cleverswine

5

個別の値が必要ですか?すなわち、{a、a、b、b、a、c、c、a}が存在するだろうか?ない場合は、LINQを使用することができます。あなたの更新日時

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

を。おそらく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; 
     } 
    } 
} 
+0

申し訳ありませんが、私は明らかにすべきでした - 私は明確な値を必要としません。これは非常に単純な例です。私は実際にループ内のオブジェクトのプロパティを比較しています(そしてそのプロパティによってソートされています)。 – cleverswine

+0

"DistinctBy"のサンプルを交換します... –

0

は限りString.Emptyのはあなたのリストの要素になることはありませんし、あなたのリストがソートされているように私にはよさそうです。 theListが他のスレッドによって変更されていないことを確認したいかもしれません。リスト内の遷移に関する作業を処理するためのかなりストックな方法のように見えます。

0

私は以下の解決策をとることに決めました。これははるかにきれいですが、より多くのdbコールを生成します。

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

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

ので、代わりに{A、B、B、C、C}、Iは、処理されます{、A}、{B、B}、{C、C}で始まるの

+0

foreach(従業員=> employee.Employer)のforeach(var employeeGroup) foreach(従業員グループの従業員var) 内部foreachループは、雇用者のすべての従業員をループします。employeeGroup.Keyは雇用者です – Niki

+0

私はGroupByについて知りませんでした。それはかなり甘いです。私がやったリファクタリングなしで私の元の問題を解決すると思います。私は今試してみる必要があります:) – cleverswine

+0

ああ、それはLINQですもの。私は金曜日の午後3時にコードベースにLINQを投げる準備ができていません。参考までに、MSDNにまともな例があります:http://msdn.microsoft.com/en-us/library/bb534304.aspx – cleverswine