2011-01-24 132 views
17

我有類foo的實例,我想將它作爲IEnumerable返回。 我能做到,而無需創建一個新的列表等。作爲IEnumerable返回單實例對象

也許類似以下內容:

IEnumerable<foo>.fromInstance(foo) 
+2

[傳遞單個項目爲IEnumerable ](http://stackoverflow.com/questions/1577822/passing-a-single-item-as-ienumerablet) – nawfal 2013-02-17 12:19:42

+0

可能重複[將單個項目傳遞爲IEnumerable ](https://stackoverflow.com/questions/1577822/passing-a-single-item-as-ienumerablet) – 2017-06-22 18:11:16

回答

20

選項:

  • 創建集合類的實例,比如一個數組或列表。這在默認情況下是可變的,如果這是你希望能夠在你的API中發佈的序列,那將會略微無益。雖然你可以創建一個圍繞這樣的集合的ReadOnlyCollection<T>包裝
  • 根據Botz3000的答案編寫自己的迭代器塊
  • 如果您使用的是.NET 3.5,則可以使用LINQ的Enumerable.Repeat(item, 1)

這裏最好的答案取決於用法。如果你只需要需要這個調用另一個使用序列的方法,並且你知道它不會被修改,我可能會使用一個數組。例如,爲了調用Concat一些其他的序列,你可能想:

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

我有信心,Concat不會發生變異的陣列,而不是其他所見過的參考陣列本身。

如果您需要將序列返回給其他代碼,並且您不知道它可能會對它做什麼,那麼我可能會使用Enumerable.Repeat

12

最好的慣用方式做到這一點是一樣的東西new[] { foo }剛剛創造的1個元素的數組不管什麼類型foo被聲明爲是。

其中一個可能的缺點是數組不是不可變的,因此有人可以將IEnumerable<T>轉換爲T[]並更改其中的值。不過這不太可能,所以我不擔心它。

+0

簡潔,乾淨。這應該是最重要的,並被接受。 +1 – data 2013-05-07 14:02:07

0

IENumerable應該用於您可以枚舉的東西,因此將它用於單個實例似乎很奇怪。如果你真的需要,你可以像這樣完成它。這可能是一個更好的辦法,但這應該完成這項工作:

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

不管你怎麼看,你實際上是試圖讓一個元素的列表,然後它真的沒有理由讓它一個列表。

+3

可能有很多理由將單個對象轉換爲IEnumerable。例如。有人可能想將它傳遞給一個期望IEnumerable的方法,或者它可以用來模擬Maybe monad等。 – 2011-01-24 07:20:16

17

你可以這樣做:

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

我第二個這個響應;這種技術對枚舉特定的成員變量也很有用。 – Apelsin 2013-05-07 18:34:03

相關問題