代码之家  ›  专栏  ›  技术社区  ›  unom

这个ForEach循环怎么了?

  •  1
  • unom  · 技术社区  · 14 年前

    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循环都不起作用。标记列表只是一个列表。

    5 回复  |  直到 14 年前
        1
  •  5
  •   Anon.    14 年前

    Trim() Replace() 不要修改调用它们的字符串。它们创建了一个新的字符串,并对其应用了操作。

    你想用 Select ,不是 ForEach .

    tagList = tagList.Select(t => t.Trim()).Select(t => t.Replace(" ", "_")).ToList();
    
        2
  •  2
  •   Joel Coehoorn    14 年前

    ForEach(和其他“linq”方法)不修改list实例。

    tagList = tagList.Select(tag => tag.Trim().Replace(" ", "_")).ToList();
    
        3
  •  2
  •   Toan Nguyen    14 年前

    原因是字符串是不可变的。因此,每个Trim()或Replac()函数的结果将生成一个新字符串。您需要重新分配到原始元素才能看到更新的值。

        4
  •  2
  •   pdr    14 年前

    这就是为什么微软没有在IEnumerable上实现ForEach。这个怎么了?

    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();
    
        5
  •  1
  •   Sean Amos    14 年前

    如果你所说的“不工作”,你的意思是他们实际上什么都不做,我认为你需要调整一下你的代码:

    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 _