วิธีที่ชอบในการสร้างลำดับ <T> ของ IEnumerable ใหม่จากค่าเดียว?


98

ฉันมักจะสร้างลำดับจากค่าเดียวโดยใช้ไวยากรณ์ของอาร์เรย์ดังนี้:

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

หรือใช้รายการใหม่ ฉันต้องการทราบว่าใครมีวิธีที่ชัดเจนกว่านี้ในการทำสิ่งเดียวกันนี้


3
ลำดับที่ว่างนั้นเป็นอย่างไร?
CoderDennis

มันเป็นเพียงแค่อายที่ dotnet Enumerable.From<T>(params T[] items)ยังคงไม่ได้มีสิ่งที่ต้องการ
Good Night Nerd Pride

คำตอบ:


145

ตัวอย่างของคุณไม่ใช่ลำดับว่าง แต่เป็นลำดับที่มีองค์ประกอบเดียว ในการสร้างลำดับสตริงว่างคุณสามารถทำได้

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

EDIT OP ชี้แจงว่าพวกเขาต้องการสร้างค่าเดียว ในกรณีนั้น

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

ฉันฟุ้งซ่านขอโทษ ฉันหมายถึงสร้างจากค่าเดียวไม่ใช่สร้างอินสแตนซ์เปล่า!
Marcel Lamothe

นี่คือ 'คำตอบ' ฟันธง?
n8wrl

วิธีนี้ใช้งานได้ดีกว่าการสร้างอาร์เรย์ใหม่
Roy Tinker

69

ฉันชอบสิ่งที่คุณแนะนำ แต่เมื่อละเว้นประเภทอาร์เรย์:

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

4
ฉันไม่เคยตระหนักว่าคุณสามารถทำเช่นนั้นได้ ฉันคิดว่าสิ่งนี้ชัดเจนกว่าการใช้ซ้ำ
Marcel Lamothe

1
แต่นี่ไม่ใช่ IEnumerable แต่เป็นอาร์เรย์!
Zodman

4
@ ไบรอันวัตต์ฉันรู้ แต่มันเป็นการนำ IE มาใช้อย่างเป็นรูปธรรม คำถามกำลังถามหา IEnumerable <> (แม้ว่าจะไม่ใช่ตัวอย่างก็ตาม) มีความแตกต่าง
Zodman

บางทีคำถามควรเปลี่ยน
Zodman

1
@ Jonesopolis: นั่นคือสถานการณ์ที่แตกต่างและไม่เกี่ยวข้องกัน คุณสามารถใช้Task.FromResultเพื่อบรรลุสิ่งนั้นได้
Bryan Watts

22

หรือสั้นกว่านั้น

string[] single = { "abc" };

ฉันจะสร้างวิธีการขยาย:

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

หรือดีขึ้นและสั้นลงเพียง

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

บางทีนี่อาจเป็นสิ่งที่Enumerable.Repeatทำภายใต้ประทุน


1
คนสุดท้ายสดใส ยกเว้นชื่อ ... มันจะขัดแย้งกับประเภทที่ใช้ IEnumerable อยู่แล้วเช่นสตริงในตัวอย่างของคุณ ลอง. AsSingleItemEnumerable () หรือง่ายๆ. Yield () -> "abc" .Yield ()
DanO

8
ฉันคิดว่า ToEnumerable เหมาะสมกว่า
Zodman

2
+1 Yieldเป็นสิ่งที่ดี ฉันทำIEnumerable<T> Yield<T>(this T source, params T[] others)เกินไป
Jodrell

ฉันพยายามทำ Yield โดยสิ้นเชิงเพื่อสนับสนุนแลมด้า แต่อย่างใดก็ไม่เคยรวบรวม ... cf. stackoverflow.com/questions/1217729/… ;-)
Peter - Reinstate Monica

@PeterSchneider คุณทำอย่างนั้นได้อย่างไรและทำไม? หากไม่เห็นรหัสฉันไม่สามารถแสดงความคิดเห็นได้ ฉันไม่คิดว่าฉันติดตามคุณ
nawfal

5

หรือเพียงแค่สร้างวิธีการ

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

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

หรือ

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

การใช้งาน:

IEnumerable<string> items = CreateEnumerable("single");
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.