2013-04-02 8 views
5

Ich möchte ein HashSet durchlaufen und eine (komplizierte) Überprüfung jedes Elements durchführen, was dazu führt, dass das Element gespeichert wird, das Element aus dem HashSet entfernt wird oder nichts getan wird.enumeriere hashset und lösche Elemente daraus

Da eine foreach-Schleife mir nicht erlaubt, den HashSet zu ändern, und ein Index nicht verfügbar ist, weiß ich nicht, wie ich die Aufgabe ausführen soll (ohne langsame Dinge wie das Kopieren des HashSets oder das Anwenden mehrerer LINQ-Operationen, also das Aufzählen) HashSet mehr als einmal).

Irgendwelche Vorschläge?

+1

'Speichern des Elements' wo möchten Sie Element speichern? Angenommen, wenn Sie nichts tun, wird es * im Hash-Set gespeichert * –

+0

Nein, ich möchte das "beste" Element aus dem HashSet in einem Optimierungs-Sinn finden und speichern, wo ich eine mehrstufige Prozedur durchführe, die alle bereits vorhandenen Elemente löscht hat den bestmöglichen Wert überschritten. –

Antwort

7

Sie müssen nur RemoveWhere() mit einer geeigneten Prädikatfunktion verwenden.

Sie können einen Nebeneffekt Ihres Prädikats haben, der das geprüfte Element kopiert (vorausgesetzt, dass Sie das mit "Element speichern" meinen), falls erforderlich. Vielleicht klingt das ein bisschen hacky, aber es würde gut funktionieren, denke ich.

Dies funktioniert, weil Ihre Prädikatfunktion wird mit jedem Elemente des HashSet in einer undefinierten Reihenfolge präsentiert werden, und daher können Sie entscheiden, was mit jedem Elemente zu tun, sowie true Rückkehr, es zu löschen und false es zu halten.

[EDIT] Hier ist ein Codebeispiel.

using System; 
using System.Collections.Generic; 

namespace Demo 
{ 
    public class Program 
    { 
     [STAThread] 
     private static void Main(string[] args) 
     { 
      var hashSet = new HashSet<int> {4, 0, 6, -1, 23, -8, 14, 12, -9, 5, 2}; 
      var itemProcessor = new ItemProcessor(); 

      hashSet.RemoveWhere(itemProcessor.Process); 

      Console.WriteLine("Max = {0}, Min = {1}", itemProcessor.Max, itemProcessor.Min); 
      Console.WriteLine("\nHashSet contents:"); 

      foreach (int number in hashSet) 
      { 
       Console.WriteLine(number); 
      } 
     } 
    } 

    public sealed class ItemProcessor 
    { 
     private int max = int.MinValue; 
     private int min = int.MaxValue; 

     // Removes all negative numbers and calculates max and min values. 

     public bool Process(int item) 
     { 
      max = Math.Max(item, max); 
      min = Math.Min(item, min); 

      return (item < 0); 
     } 

     public int Max { get { return max; } } 
     public int Min { get { return min; } } 
    } 
}