LINQ를 사용하여 List <string>의 모든 문자열을 소문자로 변환하는 방법은 무엇입니까?


94

어제 여기에있는 StackOverflow의 응답 중 하나에서 코드 조각을 보았습니다. 다음과 같았습니다.

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

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

myList의 모든 항목을 소문자로 변환하는 데 사용할 수 있기를 바랐습니다. 그러나 그것은 일어나지 않습니다 ... 이것을 실행 한 후에 myList의 대 / 소문자는 변경되지 않습니다.

그래서 제 질문은 LINQ 및 Lambda 식을 사용하여 이와 유사한 방식으로 목록의 내용을 쉽게 반복하고 수정하는 방법이 있는지 여부입니다.

고마워, 맥스

답변:


182

가장 쉬운 접근 방식 :

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

예제 코드와 크게 다르지 않습니다. ForEach원래 목록을 반복하는 반면 ConvertAll재 할당해야하는 새 목록을 만듭니다.


4
확장 방법이 아닙니다.
leppie 2011 년

@leppie : 사실, 그렇지 않습니다. 이 경우 인스턴스 메서드인지 확장 메서드인지 걱정하는 것이 다소 현명 할 수 있지만 확실히 정확합니다. :)
Jason Bunting 2011 년

그리고 문자열은 불변입니다 : P
셜록

48

ToLower 원래 문자열을 변환하는 대신 소문자 문자열을 반환 하기 때문 입니다. 따라서 다음과 같은 것을 원할 것입니다.

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

1
List <string>뿐만 아니라 모든 IEnumerable <string>과 함께 사용할 수 있기 때문에이 접근 방식이 허용되는 답변보다 더 좋습니다.
Joshua Pech 2015 년

6
이 솔루션은 .NET Core에서도 작동하며 ConvertAll은 .NET Core에 존재하지 않습니다.
Jonas

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");
}

3

ForEach를 사용합니다 Action<T>. 이는 x변경 불가능하지 않은 경우 영향을 미칠 수 있음을 의미합니다 . 이후 x입니다 string당신이 람다에서 그것을 할 아무것도 속성을 변경하지 않도록, 그것은 불변이다. Kyralessa의 솔루션은 대체 값을 반환 할 수있는 자체 확장 메서드를 구현하지 않는 한 최선의 선택입니다.


확실하지 않다면 더 많은 조사를 해주세요 ... 뭔가 기억 나 시나요?
Patrick Desjardins

오류는 인간입니다. 제가 제공 한 링크에는 굵은 글씨 3.5, 보통 2.0은 보이지 않았습니다. 내 게시물을 삭제했습니다 ... 간단한 의견으로 충분할 것입니다. 지금 가정하는 것보다 이유없이 반대 투표를 원합니다.
Patrick Desjardins

나는 거의 1 년 후에이 글을 쓰고 있지만 Daok은 아니지만 왜 당신의 대답이 "틀렸는 지"말해 줄 것입니다. 당신은 "Kyralessa의 해결책이 최선의 선택입니다"라고 대답했습니다. 더 명확합니다.
Jason Bunting

-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"))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.