2010-01-11 36 views
5

我正在尋找一種最佳方式,以便從列表中獲得一個隨機元素,其中T將是不同類型的對象,這些對象不通過基類相關。從不同的泛型列表中隨機選擇<T>

我一直在創建一個List的擴展方法,或接收List的幫助器方法,但我一直沒能把它放在一起。每次遇到處理T的問題時,我都不知道是什麼。

是否有可能做到這一點,而無需製作接口或基類?因爲我看不到任何實現不同T的基類或接口的有意義的方法。

問候 加斯帕豪格


有關通用方法的一些更多的閱讀後,我設法編寫一些代碼自己。這是我的解決方案:

public static class ListExt 
{ 
    public static T RandomItem<T>(this List<T> list) 
    { 
     if (list.Count == 0) 
      return default(T); 
     if (list.Count == 1) 
      return list[0]; 
     Random rnd = new Random(DateTime.Now.Millisecond); 
     return list[(rnd.Next(0, list.Count))]; 
    } 
} 

這是一個擴展方法,可實現從任何列表中選擇一個隨機項與下面的代碼:

private Picture SelectTopPic() 
{ 
    List<Picture> pictures = GetPictureList(); 
    return pictures.RandomItem(); 
} 
+3

爲什麼不把一個函數,它得到一個列表和通過僅選擇第n個元素,其中n是與列表的長度爲0的數返回一個T' – 2010-01-11 11:25:53

+0

我可能沒有足夠清楚地解釋我的問題是什麼,但是我找到了適合我的解決方案 - 將我的代碼添加到了帖子中。 感謝您的回答/評論 – Hauge 2010-01-11 12:01:06

回答

0

結束了一個擴展方法,示出作爲附錄原始訊息去。

.Hauge

3

有作爲「對象不是通過一個基類相關沒有這樣的事」。如果沒有別的,你總會有object s。所以List<object>會做你想做的。

+0

我意識到這一點,但我一直在尋找不涉及一個或多個轉換的方法,然後纔得到所需的東西。 – Hauge 2010-01-11 12:16:49

+1

那麼他們要麼是相同的類型,要麼他們不是。靜態類型語言中沒有真正的中間立場。 – Blindy 2010-01-11 12:25:54

+0

你又對了 - 你的意見促使我寫,我可能沒有足夠清楚地解釋我自己。如果你看看我最終使用的代碼,它可能會更清晰。正如你所看到的,我正在尋找一種方法,可以從列表中選擇一個隨機項目,並將其作爲列表包含的任何類型返回,而無需在對象類型的對象之間來回轉換。 – Hauge 2010-01-11 12:50:24

0

要從列表中獲得隨機元素,您可以使用。 ElementAt方法,傳遞要檢索的元素的隨機生成的索引。

實際上有如何從該列表中檢索一個隨機元素,在上述那MSDN鏈接的示例:

Random random = new Random(DateTime.Now.Millisecond); 
object randomItem = yourList.ElementAt(random.Next(0, yourList.Length)); 
+0

List 上沒有ElementAt方法,但我在我的代碼中使用了普通索引語法。這種方法是我已經使用的方法,但我會用很多,所以我一直在尋找一個可以使用的輔助方法或擴展方法。看到頂部的原始帖子,看看我是如何做到的。 – Hauge 2010-01-11 12:15:54