5
ハッシュセットを調べ、要素を保存する(複雑な)チェックを行い、要素をHashSetから削除するか、何もしません。ハッシュセットを列挙して要素を削除する
foreachループではHashSetを変更できないため、インデックスを使用できないため、HashSetを最初にコピーしたり、いくつかのLINQ操作を適用するなどの遅い処理を実行する方法がわかりませんHashSetを複数回使用します)。
提案がありますか?
ハッシュセットを調べ、要素を保存する(複雑な)チェックを行い、要素をHashSetから削除するか、何もしません。ハッシュセットを列挙して要素を削除する
foreachループではHashSetを変更できないため、インデックスを使用できないため、HashSetを最初にコピーしたり、いくつかのLINQ操作を適用するなどの遅い処理を実行する方法がわかりませんHashSetを複数回使用します)。
提案がありますか?
適切な述語関数を使用して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; } }
}
}
「要素を保存する」はどこに要素を保存しますか?あなたが何もしないと仮定すると、ハッシュセットで*保存されていると仮定します。 –
いいえ、HashSetの「最適な」要素をいくつかの最適化の意味で見つけて保存したいと思います。最高の可能な値を超えました。 –