通用方法问题

时间:2011-09-19 09:55:32

标签: c# generics

我正在尝试实现一个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修改为特定对象,它可以正常工作,但对任何数据库对象使用此方法都很棒。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

您的方法看起来应该是通用的:

// Note the <T> after the method name
public static T RandomRow<T>(this IQueryable<T> query)

要么是,要么把它放在通用类中。

您可能还想使用ElementAt方法而不是Skip / First

编辑:正如CodeInChaos所指出的,您对Random的使用也存在问题。有关详细信息,请参阅my article on random numbers

答案 1 :(得分:0)

您还有另一个问题:每次调用此方法时都会创建Random的新实例。这意味着如果你快速连续调用它会得到相同的结果,这会破坏封装。

您有几种方法可以避免此问题:

  1. 传入Random的实例,并让调用代码管理其生命时间
  2. 使用包含Random实例的静态字段。您需要通过使用锁定或使用线程静态字段来处理线程安全性
  3. 将其设为实例方法,并将Random设为实例字段。
  4. 使用比默认种子更好的种子进行手动播种。