2010-01-11 37 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