매개 변수 T
를 예상하는 메소드에 단일 유형의 항목을 전달하는 일반적인 방법이 IEnumerable<T>
있습니까? 언어는 C #, 프레임 워크 버전 2.0입니다.
현재 도우미 메서드를 사용하고 있습니다 (.Net 2.0이므로 LINQ와 비슷한 캐스팅 / 프로젝션 도우미 메서드가 많이 있습니다). 그러나 이것은 어리석은 것처럼 보입니다.
public static class IEnumerableExt
{
// usage: IEnumerableExt.FromSingleItem(someObject);
public static IEnumerable<T> FromSingleItem<T>(T item)
{
yield return item;
}
}
다른 방법은 물론 만들고 채우는 것 List<T>
또는를 Array
하고 대신 전달할 IEnumerable<T>
.
[편집] 확장 방법으로 이름을 지정할 수 있습니다 :
public static class IEnumerableExt
{
// usage: someObject.SingleItemAsEnumerable();
public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
{
yield return item;
}
}
여기에 뭔가 빠졌습니까?
[Edit2] 우리는 someObject.Yield()
(아래 주석에서 @Peter가 제안한 바와 같이)이 확장 방법에 가장 적합한 이름, 주로 간결성을 위해 다음과 같은 것을 발견했습니다.
public static class IEnumerableExt
{
/// <summary>
/// Wraps this object instance into an IEnumerable<T>
/// consisting of a single item.
/// </summary>
/// <typeparam name="T"> Type of the object. </typeparam>
/// <param name="item"> The instance that will be wrapped. </param>
/// <returns> An IEnumerable<T> consisting of a single item. </returns>
public static IEnumerable<T> Yield<T>(this T item)
{
yield return item;
}
}
Yield
어떻습니까? 간결함을 능가하는 것은 없습니다.
left==null
수표가 싫어 . 코드의 아름다움을 깨뜨리고 코드가 더 유연 해지지 않습니다. 언젠가 널이 될 수있는 무언가로 싱글 톤을 생성해야하는 경우는 어떻습니까? 내 말은와 new T[] { null }
동일하지 않으며 new T[] {}
언젠가는 구별해야 할 수도 있습니다.
if (item == null) yield break;
이제 null 전달을 중단하고에 대한 (사소한) null 객체 패턴을 사용하지 않습니다IEnumerable
. (foreach (var x in xs)
빈xs
을 잘 처리 합니다). 덧붙여서이 함수는 list 모나드의 모나드 단위이며IEnumerable<T>
Microsoft의 모나드 러브 페스트를 감안할 때 처음에는 프레임 워크에없는 것과 같은 것이 놀랍습니다.