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

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

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

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

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

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

고마워, 맥스



답변

가장 쉬운 접근 방식 :

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

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


답변

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

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


답변

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


답변

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


답변

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

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


답변