문제

가능한 복제 :
ienumerable에 대한 foreach와 동일합니다u003CT>

ienumerable의 LINQ 확장 방법은 매우 편리하지만 ... 당신이 원하는 모든 것이 어떤 것도 반환하지 않고 열거의 각 항목에 약간의 계산을 적용하는 것만으로도 유용하지는 않습니다. 그래서 나는 아마도 올바른 방법을 놓치고 있는지 또는 그것이 가능한 경우 내장 버전을 사용하고 싶지 않기 때문에 진정으로 존재하지 않는지 궁금합니다 ... 그러나 나는 하나를 찾지 못했습니다 :-).

어딘가에 .foreach 방법이 있다고 맹세했지만 아직 찾지 못했습니다. 그 동안, 나는 다른 사람에게 유용 할 경우 내 자신의 버전을 작성했습니다.

using System.Collections;
using System.Collections.Generic;

public delegate void Function<T>(T item);
public delegate void Function(object item);

public static class EnumerableExtensions
{
    public static void For(this IEnumerable enumerable, Function func)
    {
        foreach (object item in enumerable)
        {
            func(item);
        }
    }

    public static void For<T>(this IEnumerable<T> enumerable, Function<T> func)
    {
        foreach (T item in enumerable)
        {
            func(item);
        }
    }
}

사용법은 다음과 같습니다.

myEnumerable.For<MyClass>(delegate(MyClass item) { item.Count++; });

도움이 되었습니까?

해결책

이유에 대해 조금 더 밝게 흘리기 :

LINQ는 본질적으로 기능적입니다. 데이터를 쿼리하고 결과를 반환하는 데 사용됩니다. LINQ 쿼리는 응용 프로그램 상태를 변경하지 않아야합니다 (캐싱과 같은 일부 예외 포함). Foreach는 결과를 반환하지 않기 때문에 전달하는 것 외에 무언가의 상태를 변경하지 않는 용도가 많지 않습니다. oreach () 확장 방법이 필요한 경우 ~이다 직접 굴리기 쉽습니다.

반면에 원하는 것은 입력을 취하고 결과를 반환하는 각 항목에서 함수를 호출하는 것이면 LINQ는 선택 메소드를 통해 방법을 제공합니다.

예를 들어, 다음 코드는 목록의 모든 항목에 대한 함수 대의원을 호출하여 해당 항목이 양수 인 경우 true를 반환합니다.

    static void Main(string[] args)
    {
        IEnumerable<int> list = new List<int>() { -5, 3, -2, 1, 2, -7 };
        IEnumerable<bool> isPositiveList = list.Select<int, bool>(i => i > 0);

        foreach (bool isPositive in isPositiveList)
        {
            Console.WriteLine(isPositive);
        }

        Console.ReadKey();        
    }

다른 팁

실제로 Microsoft Research의 반응성 확장 프레임 워크 가이 기능을 추가했습니다. 에서 System.Interactive 어셈블리 그들은 a를 포함시켰다 Run() 그리고 a Do() 확장 IEnumerable<T>.

do (행동) 각 요소의 작업을 실행하고 다시 얻습니다. 예를 들어 LINQ 쿼리에 로깅을 추가하는 데 유용합니다.

var res = GetRandomNumbers(100).Take(10)
      .Do(x => Console.WriteLine("Source  -> {0}", x))
      .Where(x => x % 2 == 0)
      .Do(x => Console.WriteLine("Where   -> {0}", x))
      .OrderBy(x => x)
      .Do(x => Console.WriteLine("OrderBy -> {0}", x))
      .Select(x => x + 1)
      .Do(x => Console.WriteLine("Select  -> {0}", x));

이것은 다음과 같은 결과를 초래할 것입니다.

Source  -> 96 
Where   -> 96 
Source  -> 25 
Source  -> 8 
Where   -> 8 
Source  -> 79 
Source  -> 25 
Source  -> 3 
Source  -> 36 
Where   -> 36 
Source  -> 51 
Source  -> 53 
Source  -> 81 
OrderBy -> 8 
Select  -> 9 
9 
OrderBy -> 36 
Select  -> 37 
37 
OrderBy -> 96 
Select  -> 97 
97

실행 (액션) Foreach 루프와 같습니다. 즉, 동작을 실행하는 시퀀스를 접는 것을 의미합니다.

자세한 내용은 다음을 참조하십시오. http://community.bartdesmet.net/blogs/bart/archive/2009/12/26/more-linq-with-system-interactive-the-ultimate-mperative.aspx

RX 프레임 워크는 여기에서 찾을 수 있습니다. http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx

Foreach 메소드 켜짐 List<T> 이렇게합니다. 컬렉션을 목록에 랩핑 한 다음 해당 전화를 사용할 수 있지만 실제로는 좋은 일이 아닙니다. 당신은 당신이 당신의 자신을 굴려야하는 것 같다.

이미 논의되었습니다 여기 그리고 거기.

기억하기에는 너무 졸리지 만 기본적으로. 단일 스레드 응용 프로그램의 우포적 메소드는 이미 존재하는 foreach 문과 기능적으로 동일합니다. 내가 이해 한 바에 따르면, 주된 차이점은 foreach가 평행 할 수 있지만 원치 않는 행동을 너무 쉽게 도입한다는 것입니다.

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