Có một cách phổ biến để truyền một mục loại duy nhất T
cho một phương thức mong đợi một IEnumerable<T>
tham số không? Ngôn ngữ là C #, phiên bản khung 2.0.
Hiện tại tôi đang sử dụng một phương thức của trình trợ giúp (đó là .Net 2.0, vì vậy tôi có cả đống phương thức trợ giúp truyền / chiếu tương tự như LINQ), nhưng điều này có vẻ ngớ ngẩn:
public static class IEnumerableExt
{
// usage: IEnumerableExt.FromSingleItem(someObject);
public static IEnumerable<T> FromSingleItem<T>(T item)
{
yield return item;
}
}
Cách khác tất nhiên sẽ là tạo và điền vào một List<T>
hoặc một Array
và vượt qua nó thay vì IEnumerable<T>
.
[Chỉnh sửa] Là một phương thức mở rộng, nó có thể được đặt tên:
public static class IEnumerableExt
{
// usage: someObject.SingleItemAsEnumerable();
public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
{
yield return item;
}
}
Am i thiếu cái gì ở đây?
[Edit2] Chúng tôi thấy someObject.Yield()
(như @Peter đã đề xuất trong các bình luận bên dưới) là tên tốt nhất cho phương thức mở rộng này, chủ yếu là cho ngắn gọn, do đó, đây là cùng với nhận xét XML nếu có ai muốn lấy nó:
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;
}
}
AsEnumerable
vì tiện ích mở rộng tích hợp với tên đó đã tồn tại . (Khi T
thực hiện IEnumerable
, ví dụ , string
.)
Yield
? Không có gì nhịp đập.
left==null
kiểm tra ở đây. Nó phá vỡ vẻ đẹp của mã và khiến mã trở nên linh hoạt hơn - điều gì sẽ xảy ra nếu một ngày nào đó bạn cần phải tạo ra một singleton với thứ gì đó có thể là null? Ý tôi là, new T[] { null }
không giống như new T[] {}
, và một ngày nào đó bạn có thể cần phân biệt chúng.
if (item == null) yield break;
Bây giờ bạn đã dừng chuyển null cũng như tận dụng mẫu đối tượng null (tầm thường) choIEnumerable
. (foreach (var x in xs)
xử lý một trốngxs
chỉ tốt). Ngẫu nhiên, chức năng này là đơn vị đơn vị cho danh sách đơn vịIEnumerable<T>
, và được tổ chức lễ hội tình yêu đơn nguyên tại Microsoft, tôi ngạc nhiên khi một thứ như thế này không có trong khuôn khổ ở nơi đầu tiên.