2013-04-02 4 views
5

HashSet을 살펴보고 요소를 저장 (HashSet에서 요소를 제거하거나 아무 작업도 수행하지 않음)하는 (복잡한) 확인을하고 싶습니다.해시 셋을 열거하고 요소를 삭제하십시오.

foreach 루프를 사용하면 HashSet을 변경할 수없고 인덱스를 사용할 수 없기 때문에 HashSet을 먼저 복사하거나 여러 LINQ 연산을 적용하여 느린 작업을 수행하지 않아도 작업 수행 방법을 알 수 없습니다 한 번 이상 HashSet).

제안 사항?

+1

'요소 저장'어디에서 요소를 저장 하시겠습니까? 당신이 아무 것도하지 않을 때 해시 셋에 저장된 *라고 가정합니다. –

+0

아니요, 여러 최적화 절차에서 HashSet의 "최상"요소를 찾아서 저장하고 싶습니다. 이미 여러 단계의 절차를 거쳐 이미있는 모든 요소를 ​​삭제합니다 가능한 가장 좋은 값을 초과했습니다. –

답변

7

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; } } 
    } 
} 
관련 문제