2008-10-23 4 views
73

나는 나에게 흥미를 여기에 StackOverflow에 응답 중 하나에 어제 코드를 보았다. 내가 소문자로 myList에있는 모든 항목을 변환하는 데 사용할 수있는 기대했다어떻게 LINQ 사용하여 소문자로 목록 <string>에있는 모든 문자열을 변환하는?

List<string> myList = new List<string> {"aBc", "HELLO", "GoodBye"}; 

myList.ForEach(d=>d.ToLower()); 

: 그것은이 같은했다. 그러나, 그것은 발생하지 않습니다 ... 이걸 실행 한 후 myList의 대소 문자는 변경되지 않습니다.

그래서 제 질문은 쉽게 통해 반복이 유사한 방식으로 목록의 내용을 수정하는 LINQ 및 람다 표현식을 사용하는 방법이 있는지입니다. 원래 문자열 변환보다 때문에 ToLower는 반환 소문자 문자열이 아니라입니다

감사합니다, 최대

답변

131

가장 쉬운 방법 : 당신의 예제 코드에 비해 너무 많은 다른

myList = myList.ConvertAll(d => d.ToLower()); 

하지 않습니다. ConvertAll 당신이 다시 할당 할 필요가 새로 생성하는 반면 ForEach는 원래 목록을 반복합니다. 당신은 단지 목록 , 어떤 IEnumerable을 에 이것을 사용할 수 있기 때문에

+4

확장 방법이 아닙니다. – leppie

+0

@leppie : 사실, 그렇지 않습니다 - 좋은 소식입니다. 이 경우 인스턴스 메소드인지 확장 메소드인지에 대한 걱정은 약간의 의미가있을 수 있지만 확실히 정확합니다. :) –

+0

그리고 문자열은 변경할 수 없습니다 : P – Sherlock

3
[TestMethod] 
public void LinqStringTest() 
{ 
    List<string> myList = new List<string> { "aBc", "HELLO", "GoodBye" }; 
    myList = (from s in myList select s.ToLower()).ToList(); 
    Assert.AreEqual(myList[0], "abc"); 
    Assert.AreEqual(myList[1], "hello"); 
    Assert.AreEqual(myList[2], "goodbye"); 
} 
34

.

List<string> lowerCase = myList.Select(x => x.ToLower()).ToList(); 
+1

내가 허용 대답보다이 방법을 더 좋아한다. –

+5

이 솔루션은 .NET Core에서도 작동하지만 ConvertAll은 .NET Core에는 존재하지 않습니다. –

3

ForEachAction<T>를 사용, 그것은 불변되지 않은 경우 x에 영향을 미칠 수 있음을 의미합니다 : 그래서 당신이 뭔가를 원하는 것입니다. xstring을하기 때문에, 그것은 불변이다, 그래서 당신은 람다에 그것을 할 아무것도 속성을 변경하지 않습니다. Kyralessa의 솔루션은 대체 값을 반환 할 수있는 고유 한 확장 메서드를 구현하려는 경우가 아니면 최상의 옵션입니다.

+0

확실하지 않은 경우 더 많은 조사를 해보십시오 ... 뭔가 기억하십니까? –

+0

오류가 인간이다, 나는 제공된 링크는 내가 그것을보고하지 않은 정상에 굵게 3.5 및 2.0을했다. 내 게시물을 삭제했습니다 ... 당신의 간단한 코멘트로 충분했을 것입니다. 당신은 추측하는 것보다 아무 이유없이 downvote하고 싶습니다. –

+0

나는 거의 1 년 후이 글을 쓰고 있지만 Daok이 아니지만 왜 대답이 "틀린가"를 말할 것입니다 - 당신이 "Kyralessa의 해결책은 당신의 최선의 선택입니다"라고 말했을 때 - 제 해결책이 더 깨끗합니다 명확 해. –

-1
var _reps = new List(); // with variant data 

_reps.ConvertAll<string>(new Converter<string,string>(delegate(string str){str = str.ToLower(); return str;})).Contains("invisible"))