2016-10-06 7 views
1

フォームに4つのボタンがあるとします。 5秒ごとにこれらのボタンの背景色がランダムに変化します(ただし、同じままでもかまいません)。 バックグラウンドを変更したボタンだけを取得するにはどうすればよいですか?2つのリストを比較するプロパティの前/後

List<Button> oldList; 
     oldList = new List<Button>(); 
     foreach (Button item in Controls.OfType<Button>()) 
     { 
      //First we catch all the buttons' instances at for e.g 12:00 
      oldList.Add(item); 
     } 

     buttonsChangeColor(); //Five seconds later some buttons change their bg color 

     List<Button> newList = new List<Button>(); 
     foreach (Button item in Controls.OfType<Button>()) 
     { 
      //2nd we catch all the buttons' instances at for e.g 12:05 after some of theme changed color 
      newList.Add(item); 
     } 

     //HOW CAN I COMPARE THESE 2 LISTS BASED ON THE BACKGROUNDCOLOR ? If it has changed or not 

答えて

1

ボタンのインスタンスはoldListnewListで同じなので、古い背景色を覚えて新しいものと比較する必要があります。

次のように動作するはずです:

var oldList = Controls.OfType<Button>().ToDictionary(btn => btn, btn => btn.BackColor); 
buttonsChangeColor(); 
var changedBackgrounds = Controls.OfType<Button>() 
    .Where(btn => oldList[btn] != btn.BackColor).ToList(); 
+0

変更で実際のリストのために、さらに 'New'ポスト' WHERE'を選択することもできます!!!! – Niiw

+0

@IUSw大歓迎です。 :-) – haindl

+0

@Newwあなたが知らない場合に備えて:もしそれが助けられたならば、回答をupvoteすることもできます。 ;-) – haindl

2

これは、要素によって

var changed = oldList.Zip(newList, (old, new) => new { Old = old, New = new }) 
        .Where(old.BackColor != new.BackColor); 

Enumerable.Zipペア2つのコレクション要素を動作するはずです。ちょうど色を変更した場合、注文は変わるべきではありません - それで十分でしょう。

+0

をあなたは最終的には私の問題を解決したので、ありがとうございました –

0

チェックこの:

//モデルの仮定、様々な性質を持つ+ BackColorを

public class Button 
{ 
    // Other properties 
    public string BackColor { get; set;} 
} 

// BackColorプロパティの比較

と平等比較子を作成します。
public class ButtonBackColorEqualityComparer : IEqualityComparer<Button> 
{ 
    public bool Equals(Button x, Button y) { return x.BackColor == y.BackColor; }  

    public int GetHashCode(Button obj) { return obj.BackColor.GetHashCode(); } 
} 

次のようにコードを実行します。

var oldButtonList = new List<Button>(); 

var newButtonList = new List<Button>(); 

var colorModifiedButtonList = newButtonList.Except(oldButtonList,new ButtonBackColorEqualityComparer()); 
関連する問題