изменение значения термина во время итерации HashSet - PullRequest
2 голосов
/ 04 декабря 2011

Я использую HashSet для того, чтобы в моей коллекции не было двух (или более) элементов с одинаковым значением, в моей работе мне нужно перебрать мой хэш-набор и удалить его значения, но, к сожалению, я не могу этого сделать, что я пытаюсь сделать это:

string newValue = "";
HashSet<string> myHashSet;
myHashSet = GetAllValues(); // lets say there is a function which fill the hashset
foreach (string s in myHashSet)
{
       newValue = func(s) // lets say that func on some cases returns s as  it was and
       if(s != newValue)  // for some cases returns another va
       {
             myHashSet.Remove(s);
             myHashSet.Add(newValue);
       }

}

заранее спасибо за вашу помощь

Ответы [ 2 ]

2 голосов
/ 04 декабря 2011

Вы не можете изменять контейнер, пока он повторяется.Решением было бы спроецировать исходный набор в «измененный» набор с помощью LINQ (Enumerable.Select) и создать новый HashSet из результатов проецирования.

Так какесли существует func с соответствующей сигнатурой, вы можете напрямую вставить его в метод Enumerable.Select, а поскольку HashSet имеет конструктор , который принимает IEnumerable<T>, все сводится к одномустрока:

var modifiedHashSet = new HashSet(myHashSet.Select(func));
1 голос
/ 11 ноября 2016

Принятый ответ действительно правильный, но если, как и в моем случае, вам требуется модификация того же экземпляра, вы можете выполнить итерацию копии HashSet.

foreach (string s in myHashSet.ToArray()) // ToArray will create a copy
{
   newValue = func(s)
   if(s != newValue)
   {
         myHashSet.Remove(s);
         myHashSet.Add(newValue);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...