Cách ưa thích để tạo một chuỗi IEnumerable <T> mới từ một giá trị duy nhất?


97

Tôi thường tạo một chuỗi từ một giá trị duy nhất bằng cú pháp mảng, như sau:

IEnumerable<string> sequence = new string[] { "abc" };

Hoặc sử dụng một Danh sách mới. Tôi muốn biết liệu có ai có cách diễn đạt khác để làm điều tương tự không.


3
Làm thế nào đó là một chuỗi trống?
CoderDennis

Nó chỉ là xấu hổ khi dotnet vẫn không có một cái gì đó giống như Enumerable.From<T>(params T[] items).
Good Night Nerd Pride

Câu trả lời:


144

Ví dụ của bạn không phải là một chuỗi rỗng, mà là một chuỗi có một phần tử. Để tạo một chuỗi chuỗi rỗng, bạn có thể làm

var sequence = Enumerable.Empty<string>();

EDIT OP đã làm rõ rằng họ đang tìm cách tạo ra một giá trị duy nhất. Trong trường hợp đó

var sequence = Enumerable.Repeat("abc",1);

D'oh, tôi đã bị phân tâm, xin lỗi. Ý tôi là tạo từ một giá trị duy nhất, không phải tạo một phiên bản trống!
Marcel Lamothe

Đây là 'câu trả lời' cờ nó?
n8wrl

Phương thức này hoàn toàn là chức năng hơn là tạo một mảng mới.
Roy Tinker

69

Tôi thích những gì bạn đề xuất, nhưng với kiểu mảng bị bỏ qua:

var sequence = new[] { "abc" };

4
Tôi không bao giờ nhận ra rằng bạn có thể làm điều đó. Tôi nghĩ điều này rõ ràng hơn là sử dụng Lặp lại.
Marcel Lamothe

1
Nhưng đây không phải là IEnumerable, mà là một mảng!
Zodman

4
@Bryan Watts Tôi biết điều đó, nhưng đó là một triển khai cụ thể của IEnumerable. Câu hỏi yêu cầu IEnumerable <> (ngay cả khi ví dụ không phải). Có một sự khác biệt.
Zodman

Có lẽ câu hỏi nên được thay đổi.
Zodman

1
@Jonesopolis: Đó là một tình huống khác, không liên quan. Bạn có thể sử dụng Task.FromResultđể đạt được điều đó.
Bryan Watts

21

Hoặc thậm chí ngắn hơn,

string[] single = { "abc" };

Tôi sẽ tạo một phương pháp mở rộng:

public static T[] Yield<T>(this T item)
{
    T[] single = { item };
    return single;
}

Hoặc thậm chí tốt hơn và ngắn hơn, chỉ

public static IEnumerable<T> Yield<T>(this T item)
{
    yield return item;
}

Có lẽ đây chính xác là những gì Enumerable.Repeatđang làm.


1
Người cuối cùng là tuyệt vời. Ngoại trừ tên ... nó sẽ xung đột với các kiểu đã triển khai IEnumerable, chẳng hạn như chuỗi trong ví dụ của bạn. Hãy thử .AsSingleItemEnumerable () hoặc đơn giản là .Yield () -> "abc" .Yield ()
DanO

7
Tôi nghĩ ToEnumerable là thích hợp hơn.
Zodman

2
+1 Yieldlà tốt. Tôi cũng đã làm IEnumerable<T> Yield<T>(this T source, params T[] others).
Jodrell

Tôi đã cố gắng loại bỏ Yield hoàn toàn để ủng hộ lambda nhưng bằng cách nào đó nó không bao giờ được biên dịch ... cf. stackoverflow.com/questions/1217729/… ;-).
Peter - Khôi phục Monica

@PeterSchneider bằng cách nào và tại sao bạn làm điều đó? Nếu không nhìn thấy mã, tôi không thể bình luận. Tôi không nghĩ rằng tôi theo bạn.
nawfal

5

hoặc chỉ tạo một phương pháp

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
    if(items == null)
        yield break;

    foreach (T mitem in items)
        yield return mitem;
}

hoặc là

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
   return items ?? Enumerable.Empty<T>();
}

sử dụng :

IEnumerable<string> items = CreateEnumerable("single");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.