2013-04-02 8 views
5

ハッシュセットを調べ、要素を保存する(複雑な)チェックを行い、要素をHashSetから削除するか、何もしません。ハッシュセットを列挙して要素を削除する

foreachループではHashSetを変更できないため、インデックスを使用できないため、HashSetを最初にコピーしたり、いくつかのLINQ操作を適用するなどの遅い処理を実行する方法がわかりませんHashSetを複数回使用します)。

提案がありますか?

+1

「要素を保存する」はどこに要素を保存しますか?あなたが何もしないと仮定すると、ハッシュセットで*保存されていると仮定します。 –

+0

いいえ、HashSetの「最適な」要素をいくつかの最適化の意味で見つけて保存したいと思います。最高の可能な値を超えました。 –

答えて

7

適切な述語関数を使用してRemoveWhere()を使用するだけで済みます。

あなたの述語の副作用は、チェックされている要素をコピーすることができます(必要であれば、 "要素を保存"することを意味します)。おそらく、ちょっとハッキリと聞こえるかもしれませんが、うまくいくと思います。

これは、あなたの述語関数が定義されていない順序でHashSetの各要素と共に表示されるため、各要素の処理方法を決定し、trueとそれを保持するためにfalseを返します。

[編集]コードサンプルがあります。

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; } } 
    } 
} 
関連する問題