泛型方法问题
本文关键字:问题 泛型方法 | 更新日期: 2023-09-27 18:08:54
我正在尝试实现一个LINQ-to-SQL扩展方法,它将简单地获得一个随机行。这是我的代码:
public static T RandomRow(this IQueryable<T> query)
{
Random rand = new Random();
int row = rand.Next(0, query.Count());
return query.Skip(row).First();
}
问题是,query.Count()和query.Skip()有一个错误'方法的类型参数'…'不能从用法中推断出来。尝试显式指定类型参数。如果我将T修改为特定对象的,它会工作得很好,但是对于任何数据库对象使用此方法都很棒。
任何想法?
你的方法看起来应该是通用的:
// Note the <T> after the method name
public static T RandomRow<T>(this IQueryable<T> query)
要么这样,要么把它放在一个泛型类中。
您可能还想使用ElementAt
方法而不是Skip
/First
。
编辑:正如CodeInChaos所指出的,你使用Random
也是有问题的。
您还有另一个问题:您在每次调用此方法时创建Random
的新实例。这意味着如果您快速连续调用它,将得到相同的结果,这会破坏封装。
有几种方法可以避免这个问题:
- 传入
Random
实例,并让调用代码管理其生命周期 - 使用包含
Random
实例的静态字段。您需要通过使用锁或使用线程静态字段 来照顾线程安全。 - 设置为实例方法,并设置
Random
为实例字段。 - 使用比默认种子更好的手动播种。