枚举哈希集并从中删除元素

本文关键字:删除 元素 哈希集 枚举 | 更新日期: 2023-09-27 18:07:05

我想遍历一个HashSet,并对每个元素进行(复杂的)检查,结果是保存该元素,从HashSet中删除该元素或什么都不做。

由于foreach循环不允许我更改HashSet和索引不可用,我不知道如何执行任务(不做缓慢的事情,如首先复制HashSet或应用几个LINQ操作,这意味着枚举HashSet不止一次)。

有什么建议吗?

枚举哈希集并从中删除元素

您只需要使用RemoveWhere()和适当的谓词函数。

如果需要,

谓词可以产生一个副作用,即复制被检查的元素(假设这就是您所说的"保存元素")。也许这听起来有点俗气,但我认为它会工作得很好。

这是有效的,因为您的谓词函数将以未定义的顺序呈现HashSet的每个元素,因此您可以决定对每个元素做什么,以及返回true删除它和false保留它。

[EDIT]下面是一个代码示例。

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