John Oxley
그는 물었다 11년 전
157

함께 반품하십시오 리누머이블 네스트된 출력

나는 다음 함수는 afaq 검증 오류뿐만 카드를. 내 질문에 다루는 데 관련시킵니다 게테로스. 두 방법 모두 똑같이 반품하십시오 IEnumerable&lt ErrorInfo&gt, 유형 ','.

private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
    var errors = GetMoreErrors(card);
    foreach (var e in errors)
        yield return e;

    // further yield returns for more validation errors
}

모든 오류가 발생할 수 있다 '' 제모리에로스 반환되기를 열거하십시오 필요 없이 그들을 통해?

이것은 아마도 생각하고 있지만, 바보 같은 질문, I want to smartupdate I& # 39 m not going 빗나갔다.

JoshJordan
그는 11년 전 댓글을 달았습니다
0

39 i&, m happy (및 궁금하다!) i don& t, 최대 출력 반품하십시오 질문을합니다 따라오렴 # 39 더 보려면 제법 이해해야 있어요. 것은 바보 같은 질문!

Andrew Hare
그는 11년 전 댓글을 달았습니다
0

지정하십시오. 제카르프로두스션발리다티오너로슈포르 '?'

Sam Saffron
그는 11년 전 댓글을 달았습니다
4

, 복귀하십시오 제모리에로스 (카드) 문제가 있는 건 뭐가 있어요?

Jon Skeet
그는 11년 전 댓글을 달았습니다
10

@Sam: 더 자세한 것은 검증 errors&quot 되돌려줍니다 ";

William Jockusch
그는 5년 전 댓글을 달았습니다
1

비 모호한 관점에서는 하나의 문제는 can& # 39 는 언어를 구현하는 방법, t, T, 아무것도 없는 다운로드되었는지 모두 IEnumerable&lt T>. 그래서 다른 chunghwa 힘을 쏟고 있는 합니다. 즉, 이렇게 좋은 방법이 될 수 있는 it 합니다. 일드 일드 반품하십시오 IEnumerable&lt 구축, foo, 아마도, 여기서 foo T&gt,?

답변 6 개

39 의 바보 같은 질문, it& it& 말해둘꼐요 없습니다 # 39 의 생각하신거야 일드 일드 'vs'! '를 통해 지원하는' F # 모든 수집품을 단일 항목에 대해. (측면에서 매우 유용할 수 있는 꼬리를 반복이.)

39 의 죄송합니다. it& C # 에서 지원되지 않습니다.

그러나 여러 가지 방법으로 ',' 한 경우, 각 IEnumerable&lt ErrorInfo&gt 반환 코드를 만들 수 있는 ',' 간단해진다는 너메라브레이콩카트 사용할 수 있습니다.

private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
    return GetMoreErrors(card).Concat(GetOtherErrors())
                              .Concat(GetValidationErrors())
                              .Concat(AnyMoreErrors())
                              .Concat(ICantBelieveHowManyErrorsYouHave());
}

39 의 매우 중요한 차이점은 표시되어도 there& 한 두 개의 구현. , 는 call 이 번호요 경우에도 즉시 모든 방법을 사용해야만 반환되었습니다 iterator 는 한 번에 하나씩. # 39 의 루프 '를 통해 기존 코드를 때까지 기다리는 it& 제모리에로스 ()' 에 대한 모든 것을 요청하기 전에 다음 오류가 있다.

일반적으로 이 isn& 중요하지만, s, t # 39 it& # 39 의 규모의 what& 이해 # 39 경우 발생할 것입니다.

redcalx
그는 10년 전 댓글을 달았습니다
1

39 의 System.Linq.Enumeration.Concat&lt &gt it& 경미함 수정 기능을 합격자 기준 -;; (첫 번째, 두 번째). 필터링되지 리누메라티온.콩카트 ().

Jon Skeet
그는 10년 전 댓글을 달았습니다
0

@the-locster: # 39 m, i& 잘 모르는 거죠. # 39 의 말해둘꼐요 열거 it& 아닌 열거도. 당신이 당신의 또 화낼려구요 구체화합니다

Steven Oxley
그는 10년 전 댓글을 달았습니다
0

Do you mean security. 메서드을 @jon 스키트 정확히 어떤 것이며, 그 즉시? 마치 내가 실행했음 it& # 39 의 테스트 및 메서드 호출 때까지 이 일을 하고 완전히 실제로 이터레이션되는. 코드 위치: http://pastebin.com/0kj5QtfD

Jon Skeet
그는 10년 전 댓글을 달았습니다
5

@Steven: 아냐. , # 39 의 it& 네 경우엔 제더에로스 () 메서드를 호출 (etc) 가 아니라 '-' 하고 그 결과 와 # 39 를 사용하여, re 구현됩니까 they& 반복자가 블록). 뭐 그런 그들을 반환되기를 종료기 변경 및 새로운 어레이나 you& # 39, ll see what I 짓궂군요.

Steven Oxley
그는 10년 전 댓글을 달았습니다
0

좋아요, 그럼 @jon 이해했소. 뿐만 아니라, 그리고 그 사실을 간과하지 것 같다, 는 리누머이블 어레이에서는 호출하십시오 메서드입니다 는 서로 다른 두 결과를 가져오는 방법 및 셨으며 (I& # 39 m, 새로운 생각을 반복자가 블록). 전 주셔서 감사합니다.

이렇게 모든 오류 소스뿐만 설정할 수 있습니다 (존 Skeet& 메소드 이름을 빌려 # 39 의 답).

private static IEnumerable<IEnumerable<ErrorInfo>> GetErrorSources(Card card)
{
    yield return GetMoreErrors(card);
    yield return GetOtherErrors();
    yield return GetValidationErrors();
    yield return AnyMoreErrors();
    yield return ICantBelieveHowManyErrorsYouHave();
}

그런 다음 그들을 반복할 동시에건간에.

private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
    foreach (var errorSource in GetErrorSources(card))
        foreach (var error in errorSource)
            yield return error;
}

또는 오류 '와' 셀레스트마니 소스뿐만 병합해야 수 있습니다.

private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
    return GetErrorSources(card).SelectMany(e => e);
}

실행 방법은 '에서' 게테로르수크스 늦춰질 가능성이 없다.

내가 '빠른' yield_ 스니핏 마련했다.

! yield_ 현세생 애니메이션 있다

39 의 스니핏 here&, XML:

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Author>John Gietzen</Author>
      <Description>yield! expansion for C#</Description>
      <Shortcut>yield_</Shortcut>
      <Title>Yield All</Title>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal Editable="true">
          <Default>items</Default>
          <ID>items</ID>
        </Literal>
        <Literal Editable="true">
          <Default>i</Default>
          <ID>i</ID>
        </Literal>
      </Declarations>
      <Code Language="CSharp"><![CDATA[foreach (var $i$ in $items$) yield return $i$$end$;]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

Ian Kemp
그는 일 년 전 댓글을 달았습니다
0

이 질문에 대한 답을 어떻게 됩니까?

John Gietzen
그는 일 년 전 댓글을 달았습니다
0

@Ian, 이건 어떻게 해야 할 일은 복귀하십시오 네스트된 출력 C # 에서. F #! ',' 같은 것은 없다.

내가 사용하는 함수가 I& don& # 39, 아무것도 보이지 않는다 # 39, d, 문제가 있다고 그리웠댔지 하고 있다.

결승전에서 다시 이끌어낼 것 같은 요소가 있는 것은, 매번 열거도 호출되었을 외면하였나니 너회가 할꺼이나 포리치 루프 같은 호출되었을 때마다 1 요소 돌려준다. 조건문 너회의 포리치 결과 세트 필터링하려면 넣을 수 있습니다. (제외 기준에 따라 않은 것만으로도 중에서)

나중에 추가할 수 있는 방법을 추가할 경우 후속 익올때 계속해 1 요소를 열거도 userdic. 그렇게 행동한다면 가능하다.

public IEnumerable<string> ConcatLists(params IEnumerable<string>[] lists)
{
  foreach (IEnumerable<string> list in lists)
  {
    foreach (string s in list)
    {
      yield return s;
    }
  }
}

39 m, i& 간단한 방법을 알고 놀란 사람이 없고,, '에' IEnumerable&lt 추천합니까 확장명은 IEnumerable&lt T&gt &gt 우회된 유지할 수 있도록 이 코드를 실행. # 39 m 팬으로 i& 우회된 실행, 메모리 크기가 작은 것은 물론, 그 중 여러 가지 이유로 큰 몽구스 열거.

public static class EnumearbleExtensions
{
    public static IEnumerable<T> UnWrap<T>(this IEnumerable<IEnumerable<T>> list)
    {
        foreach(var innerList in list)
        {
            foreach(T item in innerList)
            {
                yield return item;
            }
        }
    }
}

이렇게 네 경우엔 이를 사용할 수 있습니다

private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
    return DoGetErrors(card).UnWrap();
}

private static IEnumerable<IEnumerable<ErrorInfo>> DoGetErrors(Card card)
{
    yield return GetMoreErrors(card);

    // further yield returns for more validation errors
}

마찬가지로, 할 수 있는 기능 등을 중심으로 래퍼 '와' 그냥 '이동' 을 도게테로스 풀다 캘시테.

huysentruitw
huysentruitw
그는 4년 전 댓글을 달았습니다
1

아마도 아니예 생각해본 적이 있기 때문에 ' (카드) 지젤치마니 도게테로스 확장명으로 방법 (x = &gt. x) '가 동일하며, 우회된 비헤이비어를 유지합니다. 이것이 바로 어떤 애덤 제안됩니다 [그의 답변은] 에서 (http://stackoverflow.com/a/22912410/1300910).

가능한 한 번에 모든 오류 반환되기를 그렇습니다. 그냥,, 'a', '또는' ReadOnlyCollection&lt 복귀하십시오 List&lt T&gt T&gt.

',' You& T&gt 반환하여 IEnumerable&lt, # 39, re 돌아온 시퀀스일 뭔가. 되돌릴 수 있는 것, 동일한 서피스의 취합은 수축됐는데 많은 차이, 사항에 유의해야 합니다.

모음

  • 이 모든 것을 확인할 수 있는 경우에 해당하는 항목이 모두 요청자에게 수집 및 컬렉션 반환됨. 모음의 경우 컬렉션은 정말 안 좋은 생각, 반품 호출당 만들어야 합니다.
  • 대부분의 경우 반환되었습니다 컬렉션 수정할 수 있습니다.
  • 컬렉션 크기가 한정되어 있다.

시퀀스에만

  • 거의 모든 그러거라 말할 수 없다, 즉 열거됩니다 수 있습니다.
  • A 반환되었습니다 e0100042.log 자체를 수정할 수 없습니다.
  • 각 요소를 통해 실행 e0100042.log 일부로 만들 수 있습니다 (즉, 다시 'IEnumerable&lt, T&gt, 느긋한 계산법', ',' List&lt T&gt 되돌릴 수 없는).
  • 무한 남겨두십시오 결정할 수 있으므로 이를 요청자에게 시퀀스일 시용되는 요소를 귀의하노라 합니다.
Brian Rasmussen
Pavel Minaev
그는 11년 전 댓글을 달았습니다
0

모든 것이 정말 필요한 경우 발생할 수 있습니다 돌아온 것은 클라이언트뿐 오버헤드에 컬렉션을 통해 데이터 구조를 할당했는지 열거하십시오 만큼 모든 요소에 대해 열었다. 또 다른 방법을 위임합니다 that& # 39 의 경우, 그 후 다시 시퀀스일 캡처을 취합은 部门从 추가 복사 및 모를 가부키쇼 항목 (및 카타시안 알마예요 오버헤드에) 이 5월 잠재적으로 mediaagent. 따라서, 단지 좋은 방법이 될 수 있을 때 이미 복귀하십시오 취합은 않고 직접 반환되었습니다 복사 및 (또는 랩된 tpc. readonlyfrom). 다른 모든 경우에, sequence 가 더 나은 선택을

Brian Rasmussen
그는 11년 전 댓글을 달았습니다
0

I agree, 만일 내가 말한 것이 항상 좋은 인상을 갖고 있어 되돌리기 컬렉션은 누락했습니다 내 말은 있습니다. I was trying to 강조표시합니다 차이가 없다는 것을 다시 돌아온 시퀀스일 수거 및 있다. 이를 위해 노력하겠다고 보다 선명해진다.