我想通过一个 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; } }
}
}