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

StackOverflow https://stackoverflow.com/questions/230973

  •  04-07-2019
  •  | 
  •  

문제

어제 StackoverFlow의 응답 중 하나에서 코드 스 니펫을 보았습니다. 그것은 다음과 같은 것이 었습니다.

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

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

MyRist의 모든 항목을 소문자로 변환하는 데 사용할 수 있기를 바랐습니다. 그러나, 그것은 일어나지 않습니다 ... 이것을 실행 한 후에, 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 a 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"))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top