for...if 배열 반복에 대한 대체
문제
나는 Python의 목록 이해를 좋아합니다. 왜냐하면 목록의 변환을 간결하게 나타내기 때문입니다.
그러나 다른 언어에서는 다음과 같은 내용을 쓰는 경우가 많습니다.
foreach (int x in intArray)
if (x > 3) //generic condition on x
x++
//do other processing
이 예제는 C#으로 되어 있는데, LINQ가 도움이 될 수 있을 것 같습니다. 하지만 우아하지 않은 이 솔루션을 대체할 수 있는 몇 가지 일반적인 프로그래밍 구조가 있습니까?아마도 내가 고려하고 있지 않은 데이터 구조일까요?
해결책
원본의 증가 foreach
루프는 배열의 내용에 영향을 미치지 않습니다. 이를 수행하는 유일한 방법은 for
고리:
for(int i = 0; i < intArray.Length; ++i)
{
if(intArray[i] > 3) ++intArray[i];
}
Linq는 기존 컬렉션이나 시퀀스를 수정하기 위한 것이 아닙니다.기존 시퀀스를 기반으로 새 시퀀스를 생성합니다.Linq를 사용하여 위의 코드를 달성하는 것이 가능하지만 목적에 약간 어긋납니다.
var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i));
var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i));
사용 where
(또는 이와 동등한)은 다른 답변 중 일부에서 볼 수 있듯이 결과 시퀀스에서 3보다 작거나 같은 값을 제외합니다.
var intArray = new int[] { 10, 1, 20, 2 };
var newArray = from i in intArray where i > 3 select i + 1;
// newArray == { 11, 21 }
이있다 ForEach
대신 람다 함수를 사용할 수 있게 해주는 배열의 메소드 foreach
블록이지만 메서드 호출 이상의 경우에는 계속 사용하겠습니다. foreach
.
intArray.ForEach(i => DoSomething(i));
다른 팁
C#에서는 다음과 같이 IEnumerable 내부에 있는 모든 항목에 선택적 처리를 적용할 수 있습니다.
intArray.Where(i => i > 3).ConvertAll();
DoStuff(intArray.Where(i => i 3));
등..
파이썬에서는 필터 및 지도, 원하는 대로 할 수 있습니다.
map(lambda x: foo(x + 1) filter(lambda x: x > 3, intArray))
또한 있습니다 이해 목록을 나열하다 하나의 쉬운 명령문으로 두 가지를 모두 수행할 수 있습니다.
[f(x + 1) for x in intArray if x > 3]
루비에서:
intArray.select { |x| x > 3 }.each do |x|
# do other processing
end
또는 "기타 처리"가 짧은 한 줄인 경우:
intArray.select { |x| x > 3 }.each { |x| something_that_uses x }
마지막으로, 3보다 큰 요소의 처리 결과를 포함하는 새 배열을 반환하려는 경우:
intArray.select { |x| x > 3 }.map { |x| do_something_to x }
map(lambda x: test(x + 1) filter(lambda x: x > 3, arr))
언어와 수행해야 할 작업에 따라 다양한 언어로 불리는 "지도"가 원하는 것일 수 있습니다.나는 C#을 모르지만, 이것 페이지에서 .NET 2.0은 맵 "ConvertAll"을 호출합니다.
"맵"의 의미는 매우 간단합니다. 목록을 가져와 각 요소에 함수를 적용하고 새 목록을 반환합니다.다른 목록의 조건을 만족하는 항목 목록을 제공하는 "필터"를 찾을 수도 있습니다.