문제

나는 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"을 호출합니다.

"맵"의 의미는 매우 간단합니다. 목록을 가져와 각 요소에 함수를 적용하고 새 목록을 반환합니다.다른 목록의 조건을 만족하는 항목 목록을 제공하는 "필터"를 찾을 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top