2009-12-30 2 views
5

람다 식 List <String>에서 String.Format을 수행하는 방법?

다음과 같은 목록이 있습니다.

List<String> test = new List<String> {"Luke", "Leia"}; 

test.Select(s => String.Format("Hello {0}", s)); 

목록에서 이름을 조정하지 않습니다. 이 람다 식을 사용하여 이들을 변경하는 방법이 있습니까? 그렇지 않으면 문자열이 변경되지 않아 작동하지 않습니다.

답변

12

Select 원본 컬렉션을 수정하지 않습니다. 당신이 foreach는으로 열거하거나 목록에 변환 할 수있는 새로운 IEnumerable을 <T> 작성

List<String> test2 = test.Select(s => String.Format("Hello {0}", s)).ToList(); 

테스트를 여전히 "누가 복음""레아"TEST2을 포함"Hello Luke""Hello Leia"이 포함되어 있습니다. 당신은 람다 식 원래 목록을 수정하려면


, 개별적으로 각 목록 항목에 람다 식을 적용하고 컬렉션에 결과를 다시 저장할 수 있습니다 :

Func<string, string> f = s => String.Format("Hello {0}", s); 

for (int i = 0; i < test.Count; i++) 
{ 
    test[i] = f(test[i]); 
} 
+0

덕분에, 첫 번째는 나를 위해 성공했다. –

+0

@Nyla Pareska : 그 버전은 사용자의 의도 인 것으로 보이는 원래 컬렉션을 수정하지 않습니다 ("하지만 목록의 이름은 조정하지 않습니다"). 그렇게하고 싶다면 내 대답에서 제공 한 확장 메서드를 참조하십시오. – jason

-2

당신은 할 수 foreach 문을 수행하십시오 :

test.ForEach(s=>String.Format("Hello {0}", s)); 

즉, 이름을 업데이트하려고하는 것입니다. 여기

+2

ForEach는'Action '을 취하고'List ' – dtb

+1

을 수정하지 않습니다. String.Format은 새로운 문자열을 반환하지만 원래 문자열은 수정하지 않습니다. – M4N

+0

좋아, 그렇게 업데이트 : s => s = String.Format ("Hello {0}", s)); 어쨌든 그가하고 싶은 일에 달려 있습니다. 업데이트 된 값으로 새 목록을 반환하거나 원래 목록을 업데이트하십시오. –

3

:

for(int i = 0; i < test.Count; i++) { 
    test[i] = String.Format("Hello {0}", test[i]); 
} 

필요가 없습니다 공상합니다. LINQ를 남용 할 필요가 없습니다. 그냥 간단하게 유지하십시오.

이 넘어 한 단계 이동 등과 같은 확장 메서드를 만들 수 있습니다

static class ListExtensions { 
    public static void AlterList<T>(this List<T> list, Func<T, T> selector) { 
     for(int index = 0; index < list.Count; index++) { 
      list[index] = selector(list[index]); 
     } 
    } 
} 

사용법 :

test.AlterList(s => String.Format("Hello {0}", s)); 

Select은 투사이고 정말 상황 곳 거기에 사용하기위한 것입니다 부작용이 없다. 목록의 항목을 매우 분명하게 조작하면 부작용이 있습니다. 사실, 라인

test.Select(s => String.Format("Hello {0}", s)); 

결국 투사를 생산하는 이상 열거 할 수있는 IEnumerable<string> 작성을 제외한 아무것도하지 않습니다.

+1

나는 그가 LINQ를 어떻게 남용하고 있는지 이해하지 못합니다. 그는 사용하려고했던대로 정확하게 사용할 것입니다. 또한 그의 질문은 람다 식을 사용하여 작업을 수행하는 방법을 구체적으로 물었습니다. –

+1

'Select '는 부작용을 일으킬 목적으로 사용되지 않습니다. – jason

+0

@Downvoter : 왜 당신이 downvoted에 대한 코멘트를 남겨주세요. – jason

0

또 다른 가능한 해결책 :

List<String> test = new List<String> {"Luke", "Leia"}; 
List<string> FormattedStrings = new List<string>(); 
test.ForEach(testVal => FormattedStrings.Add(String.Format("Hello {0}", testVal)));