어제 여기에있는 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"))