2013-04-02 11 views
5

Chcę przejść przez HashSet i wykonać (skomplikowane) sprawdzenie każdego elementu, który spowoduje zapisanie elementu, usunięcie elementu z HashSet lub wykonanie niczego.wylicza hashset i usuwa z niego elementy

Ponieważ pętla foreach nie pozwala mi na zmianę HashSet i indeks jest niedostępny, nie wiem jak wykonać zadanie (bez wykonywania powolnych czynności, takich jak kopiowanie HashSet jako pierwsze lub stosowanie kilku operacji LINQ, co oznacza wyliczanie HashSet więcej niż raz).

Wszelkie sugestie?

+1

'zapisywanie elementu' gdzie chcesz zapisać element? Zakładając, że nic nie robisz, to jest * zapisywane * w haszowaniu –

+0

Nie, chcę znaleźć i zapisać "najlepszy" element z HashSet w pewnym sensie optymalizacji, gdzie przechodzę przez wieloetapową procedurę, usuwając wszystkie elementy, które już zostały przekroczyła najlepszą możliwą wartość. –

Odpowiedz

7

Wystarczy użyć RemoveWhere() z odpowiednią funkcją predykatu.

Możesz mieć efekt uboczny swojego predykatu, który kopiuje sprawdzany element (zakładając, że masz na myśli "zapisz element"), jeśli to konieczne. Być może brzmi to trochę nieciekawie, ale wszystko będzie dobrze.

To działa, ponieważ funkcja predykat zostaną przedstawione z każdego elementu HashSet w nieokreślonym celu, a więc można zdecydować, co zrobić z każdego elementu, jak również powrót true aby go usunąć i false aby ją zachować.

[EDYTOWANIE] Oto przykład kodu.

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