2010-07-08 2 views
1

Да ... это один из тех дней.Что случилось с этим циклом ForEach?

public string TagsInput { get; set; } 

//further down 
var tagList = TagsInput.Split(Resources.GlobalResources.TagSeparator.ToCharArray()).ToList(); 
tagList.ForEach(tag => tag.Trim()); //trim each list item for spaces 
tagList.ForEach(tag => tag.Replace(" ", "_")); //replace remaining inner word spacings with _ 

Обе петли ForEach не работают. tagList - это просто список.

Спасибо!

+3

Пожалуйста, не говорите, что они «не работают». Пожалуйста, опишите, что вы ожидали, и что вы на самом деле наблюдали. – abelenky

ответ

5

Trim() и Replace() не изменить строку, они призвали. Они создают новую строку, на которую было применено действие.

Вы хотите использовать Select, а не ForEach.

tagList = tagList.Select(t => t.Trim()).Select(t => t.Replace(" ", "_")).ToList(); 
+0

Отлично! Он работает как рекламируемый! – unmircea

1

Если по не работают, вы имеете в виду, что они на самом деле не делают ничего, я думаю, вам нужно настроить ваш код немного:

public string TagsInput { get; set; } 

//further down 
var tagList = TagsInput.Split(Resources.GlobalResources.TagSeparator.ToCharArray()).ToList(); 
tagList.ForEach(tag => tag = tag.Trim()); //trim each list item for spaces 
tagList.ForEach(tag => tag = tag.Replace(" ", "_")); //replace remaining inner word spacings with _ 

Обрезка и замена не изменяет значение строки, они возвращают новое строковое значение.

+0

Да, но здесь вы просто заменяете локальный цикл-var. Я не думаю, что это решает что угодно. Однако анализ прав. –

+0

Правда. Анализ правильный, код дает тот же результат, что и мой. – unmircea

2

ForEach (и другие методы «linq») не изменяет экземпляр списка.

tagList = tagList.Select(tag => tag.Trim().Replace(" ", "_")).ToList(); 
+0

Я не считаю, что 'ForEach' - метод LINQ ... это метод List . И я считаю, что ForEach - это действие, которое применяется к каждому элементу в момент его вызова ... – jrista

+0

@jrista - это не метод linq. Вот почему это в кавычках. –

+0

Правильно ... однако, это действие немедленно применяется, его не задерживают. – jrista

2

Причина в том, что строка является неизменной. Таким образом, результат каждой функции Trim() или Replac() приведет к созданию новой строки. Вам нужно переназначить исходный элемент, чтобы увидеть обновленное значение.

+1

Это хорошо также ... при условии, что это не работает. – unmircea

2

Именно поэтому Microsoft havent внедрил ForEach в IEnumerable. Что случилось с этим?

public string[] TagsInput { get; set; } 

//further down 
var adjustedTags = new List<string>(); 
foreach (var tag in TagsInput.Split(Resources.GlobalResources.TagSeparator.ToCharArray())) 
{ 
    adjustedTags.Add(tag.Trim().Replace(" ", "_")); 
} 

TagsInput = adjustedTags.ToArray(); 
+0

thankyou, кто-то с некоторым фактическим смыслом. хотя вам не нужен расход списка, вы знаете, сколько у вас элементов. –

+0

Это тоже нормально. Мне это нравится. Спасибо – unmircea

Смежные вопросы