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; } }
}
}
'Speichern des Elements' wo möchten Sie Element speichern? Angenommen, wenn Sie nichts tun, wird es * im Hash-Set gespeichert * –
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. –