2013-04-02 33 views
5

Tôi muốn đi qua một HashSet và thực hiện kiểm tra (phức tạp) trên mỗi phần tử dẫn đến việc lưu phần tử, loại bỏ phần tử khỏi HashSet hoặc không làm gì cả.liệt kê hashset và xóa các phần tử từ nó

Vì vòng lặp foreach không cho phép tôi thay đổi HashSet và chỉ mục không có sẵn, tôi không biết cách thực hiện tác vụ (mà không làm những việc chậm như sao chép HashSet trước hoặc áp dụng một số thao tác LINQ có nghĩa là liệt kê HashSet nhiều lần).

Mọi đề xuất?

+1

'lưu phần tử' bạn muốn lưu phần tử ở đâu? Giả sử khi bạn không làm gì, nó được lưu * trong hashset –

+0

Không, tôi muốn tìm và lưu phần tử "tốt nhất" từ HashSet theo một số ý nghĩa tối ưu, nơi tôi thực hiện một quy trình nhiều bước, xóa tất cả các phần tử đã vượt quá giá trị tốt nhất có thể. –

Trả lời

7

Bạn chỉ cần sử dụng RemoveWhere() với chức năng vị ngữ thích hợp.

Bạn có thể có tác dụng phụ của biến vị ngữ của bạn sao chép phần tử được chọn (giả sử đó là ý của bạn bằng cách "lưu phần tử"), nếu cần. Có lẽ điều đó nghe có vẻ hơi hack, nhưng nó sẽ làm việc tốt tôi nghĩ.

Điều này hoạt động vì hàm vị ngữ của bạn sẽ được trình bày với mỗi phần tử của HashSet theo thứ tự không xác định và do đó bạn có thể quyết định làm gì với từng phần tử, cũng như trả lại true để xóa nó và false.

[EDIT] Đây là mẫu mã.

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; } } 
    } 
} 
Các vấn đề liên quan