2011-01-24 31 views
17

Tôi có ví dụ về lớp foo và tôi muốn trả về nó là IEnumerable. tôi có thể làm điều đó mà không cần tạo một danh sách mới vv ..trả về đối tượng thể hiện đơn lẻ là IEnumerable

Có lẽ giống như sau:

IEnumerable<foo>.fromInstance(foo) 
+2

có thể trùng lặp của [Truyền một mục đơn lẻ như IEnumerable ] (http://stackoverflow.com/questions/1577822/passing-a-single-item-as-ienumerablet) – nawfal

+0

Có thể trùng lặp của [Truyền một mục đơn lẻ IEnumerable ] (https://stackoverflow.com/questions/1577822/passing-a-single-item-as-ienumerablet) –

Trả lời

20

Options:

  • Tạo một thể hiện của một lớp bộ sưu tập, như một mảng hoặc một danh sách. Điều này sẽ có thể thay đổi theo mặc định, điều này sẽ hơi vô ích nếu đây là chuỗi bạn muốn có thể đưa ra trong API của mình. Bạn có thể tạo một trình bao bọc ReadOnlyCollection<T> xung quanh bộ sưu tập đó.
  • Viết khối lặp của riêng bạn theo câu trả lời của Botz3000
  • Sử dụng Enumerable.Repeat(item, 1) từ LINQ, nếu bạn đang sử dụng .NET 3.5.

Câu trả lời hay nhất tùy thuộc vào cách sử dụng. Nếu bạn chỉ cần điều này để gọi một phương thức khác sử dụng chuỗi và bạn biết nó sẽ không bị sửa đổi, tôi có thể sử dụng một mảng. Ví dụ, để gọi Concat trên một số chuỗi khác, bạn có thể muốn:

var wholeList = regularList.Concat(new[] { finalValue }); 

Tôi có niềm tin rằng Concat sẽ không đột biến mảng, và không có gì khác bao giờ sẽ thấy những tham chiếu đến các mảng chính nó .

Nếu bạn cần trả lại chuỗi cho một số mã khác và bạn không biết nó có thể làm gì với nó, tôi có thể sử dụng Enumerable.Repeat.

+0

một tùy chọn khác cho những người sử dụng Rx (http://msdn.microsoft.com/en-us/devlabs/ee794896) là phương thức EnumerableEx.Return. –

+0

Thiếu cách sạch sẽ nhất: 'mới [] {item}' – data

+0

@data_smith: Làm thế nào mà không được bao hàm bởi "Tạo một thể hiện của một lớp sưu tập, như một mảng hay một danh sách"? –

12

Cách thành ngữ tốt nhất để làm điều này là một cái gì đó giống như new[] { foo } mà chỉ tạo ra một mảng 1 phần tử của bất kỳ loại nào foo được khai báo là.

Một trong những nhược điểm có thể xảy ra là mảng không phải là bất biến, vì vậy ai đó có thể bỏ số IEnumerable<T> của bạn thành T[] và thay đổi giá trị trong đó. Điều này là khá khó, mặc dù, vì vậy tôi không lo lắng về nó.

+0

Ngắn gọn, ngắn gọn, sạch sẽ. Điều này nên được trên đầu trang và được chấp nhận. +1 – data

0

IENumerable là nghĩa vụ phải được sử dụng cho một cái gì đó mà bạn có thể liệt kê thông qua, do đó, sử dụng nó cho một trường hợp duy nhất có vẻ khá lạ. Nếu bạn thực sự cần, bạn có thể làm cho nó được thực hiện như thế này. Nó có thể là một cách tốt hơn, nhưng điều này sẽ giúp hoàn thành công việc:

List<foo> myList = new List<foo>(); 
myList.Add(myInstanceOfFoo); 
IEnumerable myEnumerable = myList.AsEnumerable(); 

Bất kể thế nào bạn thấy điều này, bạn đang thực sự cố gắng để làm một danh sách của một phần tử, và sau đó nó thực sự không có lý do gì để làm cho nó một danh sách.

+3

Có thể có nhiều lý do để biến đối tượng đơn thành IEnumerable. Ví dụ.một trong những có thể muốn vượt qua nó đến một phương pháp mà dự kiến ​​IEnumerable, hoặc nó có thể được sử dụng cho thi đua Có lẽ monad vv –

17

bạn có thể làm điều này:

public IEnumerable<Foo> GetSingleFooAsEnumerable() { 
    yield return singleFoo; 
} 
+0

Tôi thứ hai phản ứng này; kỹ thuật này cũng hữu ích cho việc liệt kê các biến thành viên cụ thể. – Apelsin

Các vấn đề liên quan