IEnumerable<T>
을 반환하는 IEnumerable<T>
에 대한 확장 방법은 어떻게 정의합니까? 목표는 모든 IEnumerable
및 IEnumerable<T>
에 대해 확장 메서드를 사용할 수있게하는 것입니다. 여기에서 T
은 익명 형식이 될 수 있습니다.IEnumerable <T>을 반환하는 IEnumerable <T>에 대한 확장 메서드 정의?
답변
임의 반복기를 작성하는 가장 쉬운 방법은, 예를 들어, 반복자 블록이다
static IEnumerable<T> Where<T>(this IEnumerable<T> data, Func<T, bool> predicate)
{
foreach(T value in data)
{
if(predicate(value)) yield return value;
}
}
키 여기 컴파일러가 생성하여, 반복기 블록에있어서 변은 "yield return
"인 열거 자 (IEnumerator<T>
)는 동일한 기능을 수행합니다. 라고 할 때, 일반적인 형식 유추가 자동으로 T
을 처리하는, 그래서 당신은 단지 필요
int[] data = {1,2,3,4,5};
var odd = data.Where(i=>i%2 != 0);
위의 잘 익명 형식을 사용할 수 있습니다. (이 익명없는만큼) 당신이 원하는 경우
당신은 coure의, T
을 지정할 수 있습니다
var odd = data.Where<int>(i=>i%2 != 0);
다시 IEnumerable
(제네릭이 아닌)이, 음, 가장 간단한 방법은입니다 호출자는 .Cast<T>(...)
또는 .OfType<T>(...)
을 사용하여 IEnumerable<T>
을 먼저받습니다. 위의 경우 this IEnumerable
을 전달할 수 있지만 호출자는 컴파일러에서 유추하지 않고 T
을 지정해야합니다. 익명 형식 인 T
과 함께 사용할 수 없으므로 익명 형식 인 IEnumerable
의 일반 형식을 사용하지 마십시오.
메서드 서명이 컴파일러에서 T
을 식별 할 수없는 약간 더 복잡한 시나리오가 있습니다 (물론 익명 형식에도 지정할 수 없습니다). 그러한 경우 일반적으로 컴파일러 이 추론을 통해 (아마도 패스 스루 메서드를 통해) 사용할 수있는 다른 서명으로 다시 팩할 수 있지만 여기에 답변을 제공하려면 실제 코드를 게시해야합니다. 토론에 이어
, 여기에 익명 형식으로 Cast<T>
을 활용하는 방법입니다. 열쇠는 형식 유추에 사용할 수있는 인수를 제공하는 것입니다 (인수가 사용되지 않더라도). 예를 들어 :
static void Main()
{
IEnumerable data = new[] { new { Foo = "abc" }, new { Foo = "def" }, new { Foo = "ghi" } };
var typed = data.Cast(() => new { Foo = "never used" });
foreach (var item in typed)
{
Console.WriteLine(item.Foo);
}
}
// note that the template is not used, and we never need to pass one in...
public static IEnumerable<T> Cast<T>(this IEnumerable source, Func<T> template)
{
return Enumerable.Cast<T>(source);
}
이 게시물은 시작하는 데 도움이 될 수 있습니다 : How do you write a C# Extension Method for a Generically Typed Class. 나는 그것이 당신이 찾고있는 것과 정확히 일치하지는 않지만 당신을 시작할 수도 있습니다.
using System;
using System.Collections.Generic;
namespace ExtentionTest {
class Program {
static void Main(string[] args) {
List<int> BigList = new List<int>() { 1,2,3,4,5,11,12,13,14,15};
IEnumerable<int> Smalllist = BigList.MyMethod();
foreach (int v in Smalllist) {
Console.WriteLine(v);
}
}
}
static class EnumExtentions {
public static IEnumerable<T> MyMethod<T>(this IEnumerable<T> Container) {
int Count = 1;
foreach (T Element in Container) {
if ((Count++ % 2) == 0)
yield return Element;
}
}
}
}
이것은 버퍼 된 반복자입니다. 일반적으로'List
(문맥을 위해, 본래 버전에는 목록
- 1. IEnumerable 용 확장 메서드 <Enum>?
- 2. Enum의 IEnumerable 확장 메서드
- 3. 캐스팅 IEnumerable <Derived> to IEnumerable <BaseClass>
- 4. IEnumerable <T>에 확장 메서드 정의 여기서 T는 특정 종류입니까?
- 5. IEnumerable <T>을 반환하는 메서드로 들어갈 수 없습니까?
- 6. IEnumerable <KeyValuePair>에서 일반 GetOnlyKeys에 대한 확장 메서드 <int, string>>
- 7. IEnumerable <T>을 어떻게 조롱합니까?
- 8. ROWLEX는 기본적으로 IEnumerable <>을 지원합니까?
- 9. DataTable과 IEnumerable <T>
- 10. Linq IEnumerable 확장 메서드 - 성능을 향상시키는 방법?
- 11. IEnumerable <T> .ConvertAll & DDD
- 12. 목록에서 선택하는 방법 <IEnumerable <ItemClass>> ~ IEnumerable <ItemClass>?
- 13. IEnumerable에서 IEnumerable <T> 가져 오기 <IEnumerable <T>>
- 14. 어디입니까 IEnumerable <T> .OrderBy 선언?
- 15. IEnumerable 메서드 디버깅
- 16. IEnumerable을 IEnumerable <> 이상으로 사용하는 경우
- 17. IEnumerable - 내 확장 방법
- 18. ListBox에 대해 IEnumerable <SelectListItem>을 IList <>에 매핑하는 방법
- 19. C# 익명 메서드 변수 범위 문제가 IEnumerable <T>
- 20. IEnumerable <KeyValuePair <>>에서 사전 다시 만들기
- 21. 언제 IEnumerable 확장 메서드에 대해 <T> 형식을 지정해야합니까?
- 22. 제네릭 IEnumerable <SelectListItem> 확장 방법을 작성하는 방법
- 23. IEnumerable <T>에 Microsoft.VisualStudio.QualityTools.UnitTesting.CollectionAssert를 사용할 수 있습니까?
- 24. C++/CLI에서 IEnumerable <T> 구현
- 25. 는 IEnumerable <T> 질문
- 26. 문자열을 IEnumerable <T> 변환 []
- 27. 와이어를 통해 IEnumerable <T>을 직렬화 하시겠습니까?
- 28. IList <T> 대 IEnumerable <T>. 보다 효율적인 IList 또는 IEnumerable <T>
- 29. Linq - IQueryable <IEnumerable>을 IQueryable로 바꾸는 방법
- 30. 엔티티 모델 컬렉션에 IEnumerable <T>을 어떻게 삽입합니까?
사용되지 않는 매개 변수를 사용하는 방법은 잘못된 것 같다. –
It * is * used .... 그냥 컴파일러가 아닌 런타임에 - –
그것은 사용되었지만 제공되었지만 명시 적으로 오히려 추측 된 것이 아닙니다 ... C# 컴파일러가 "너무 똑똑"하지 않으면 명시 적으로 지정해야한다. –