>

다음 코드가 있습니다 :

newsplit.ToList().ForEach(x => x = "WW");

목록의 모든 요소가 이제 "WW"일 것으로 예상되지만 원래 값은 그대로입니다. 어떻게 오세요? 어떻게해야합니까?

  • 답변 # 1

    newsplit 가정   IEnumerable<string> 입니다 , 원하는 :

    newsplit = newsplit.Select(x => "WW");
    
    

    현재 가지고있는 코드는 다음과 같습니다.

    foreach(string x in newsplit.ToList()) {
        AssignmentAction(x);
    }
    ...
    public static void AssignmentAction(string x) {
        x = "WW";
    }
    
    

    이 방법은 x 를 수정하지 않습니다  C #의 값별 의미와 문자열의 불변성으로 인해 발생합니다.

  • 답변 # 2

    다른 답변에서 현재 코드가 작동하지 않는 이유를 설명했습니다. 이를 해결하는 확장 방법은 다음과 같습니다.

    // Must be in a static non-nested class
    public static void ModifyEach<T>(this IList<T> source,
                                     Func<T,T> projection)
    {
        for (int i = 0; i < source.Count; i++)
        {
            source[i] = projection(source[i]);
        }
    }
    
    

    다음과 같이 사용하십시오 :

    newsplit.ModifyEach(x => "WW");
    
    

    IList<T> 의 모든 구현에서 작동합니다.  배열 및 List<T> 와 같은 . 임의의 IEnumerable<T> 와 함께 작동 해야하는 경우  시퀀스 자체를 변경할 수 없으므로 문제가 있습니다.

    Select() 사용  물론 더 기능적인 접근 방식이지만 때로는 기존 컬렉션을 변경하면할만한 가치가 있습니다 ...

  • 답변 # 3

    ForEach를 사용하면 IEnumerable의 요소를 조작 할 수 있지만 요소의 참조를 변경하십시오.

    즉, 이것은 Foo 를 설정합니다  문자열 "WW" 에 대한 IEnumerable의 각 요소 속성 :

    newsplit.ToList().ForEach(x => x.Foo = "WW");
    
    

    IEnumerable 자체의 값을 수정할 수는 없습니다.

  • 답변 # 4

    LINQ식이 익명 형식을 생성하기 때문에 읽기 전용이기 때문입니다. 할당 할 수 없습니다. 또한 각 루프의 표준에서 열거중인 컬렉션에 할당 할 수 없습니다. 시도 :

       foreach (var item in newsplit)
        {
            item = "this won't work";
        }
    
    

  • 이전 javascript - Nodejs/Expressjs 체인 인증서가 작동하지 않습니다
  • 다음 c++ - 구조에서 비트 배열을 얻는 방법?