2016-10-06 5 views
1

Sagen wir, wir haben 4 Schaltflächen auf einem Formular; Alle 5 Sekunden ändert sich die Hintergrundfarbe dieser Buttons zufällig (aber sie kann auch gleich bleiben) Wie könnte ich nur die Buttons bekommen, die ihren Hintergrund geändert haben?Vergleichen Sie zwei Liste <Control> vor/nach basierend auf der Eigenschaft

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 

Antwort

1

Da die Instanzen der Schaltflächen in oldList und newList identisch sind, müssen Sie sich die alten Hintergrundfarben merken, um sie mit den neuen zu vergleichen.

Folgendes sollte funktionieren:

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

Danke so viel Sie mein Problem endlich gelöst haben !!!! – Niiw

+0

@Niiw Sie sind herzlich willkommen. :-) – haindl

+0

@Niiw Nur für den Fall, dass Sie nicht wissen: Sie können auch eine Antwort upvote, wenn es geholfen hat. ;-) – haindl

2

sollte Dieses

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

Enumerable.Zip Paare zwei Sammlungen Element. Wenn Sie gerade Farben geändert haben, sollte sich die Reihenfolge nicht ändern - also würde es reichen.

+0

Sie wollen können weiterhin die 'New' Post wählen' Where', für aktuelle Liste mit Änderungen –

0

prüfen dies:

// Modellannahme, mit verschiedenen Eigenschaften + Backcolor

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

// Ein Gleichheitsvergleich mit Backcolor-Vergleich erstellen

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(); } 
} 

Code ausführen wie folgt:

var oldButtonList = new List<Button>(); 

var newButtonList = new List<Button>(); 

var colorModifiedButtonList = newButtonList.Except(oldButtonList,new ButtonBackColorEqualityComparer()); 
Verwandte Themen