如何删除此方法中的重复代码

本文关键字:代码 此方法 何删除 删除 | 更新日期: 2023-09-27 18:15:05

private static Game[] getMostPlayedGamesDo(int Fetch, int CategoryID)
{
    Game[] r;
    using (MainContext db = new MainContext())
    {
        if (CategoryID == 0)
        {
            var q = db.tblArcadeGames.OrderByDescending(c => c.Plays).Take(Fetch);
            r = new Game[q.Count()];
            int i = 0;
            foreach (var g in q)
            {
                r[i] = new Game(g);
                i++;
            }
        }
        else
        {
            var q = db.tblArcadeGames.Where(c=>c.CategoryID == CategoryID).OrderByDescending(c => c.Plays).Take(Fetch);
            r = new Game[q.Count()];
            int i = 0;
            foreach (var g in q)
            {
                r[i] = new Game(g);
                i++;
            }
        }
    }
    return r;
}

我似乎无法在if范围之外定义q,并且我无法将返回的值插入到 if 范围之外的数组中! 不确定如何删除此简单实例中的重复代码?

如何删除此方法中的重复代码

目前尚不清楚q的类型是什么 - 但从您的使用情况推断:

db.tblArcadeGames.OrderByDescending(...)

据推测,它是Linq-To-Sql或Entity Framework中的实体类。 在这种情况下,您确实定义了一个名为 tblArcadeGame 的具体实体。 因此,不使用q移出范围var

IQueryable<tblArcadeGame> q;
if (CategoryID == 0)
{
    q = db.tblArcadeGames.OrderByDescending(c => c.Plays).Take(Fetch);
}
else
{
    q = db.tblArcadeGames.Where(c=>c.CategoryID == CategoryID).OrderByDescending(c => c.Plays).Take(Fetch);
}
r = new Game[q.Count()];
int i = 0;
foreach (var g in q)
{
    r[i] = new Game(g);
    i++;
}

如您所见,重复的代码现在只看到一次。

附言像ReSharper这样的工具非常适合这类事情。 使用它,只需一次击键,您就可以在var版本和使用显式命名类型的版本之间切换。

你实际上应该显式键入 q。但这可能会让你在没有它的情况下逃脱(三元运算符将为你强制执行(。

var q = CategoryID == 0 ? db.tblArcadeGames.OrderByDescending(c => c.Plays).Take(Fetch)
                        : db.tblArcadeGames.Where(c=>c.CategoryID == CategoryID).OrderByDescending(c => c.Plays).Take(Fetch);
r = new Game[q.Count()];
int i = 0;
foreach (var g in q)
{
    r[i] = new Game(g);
    i++;
}

我假设q是IQueryable类型。

private static Game[] getMostPlayedGamesDo(int Fetch, int CategoryID)
{
    var q = db.tblArcadeGames;
    if (CategoryID != 0)
    {
        q = q.Where(c => c.CategoryID == CategoryID);
    }
    q = q.OrderByDescending(c => c.Plays).Take(Fetch);
    return q.Select(g => new Game(g)).ToArray();
}
    List<tblArcadeGame> q;
    /* object q; */

    if (CategoryID == 0)
    {
        q = db.tblArcadeGames.OrderByDescending(c => c.Plays).Take(Fetch).ToList();
    }
    else
    {
        q = db.tblArcadeGames.Where(c=>c.CategoryID == CategoryID).OrderByDescending(c => c.Plays).Take(Fetch).ToList();
    }
        r = new Game[q.Count()];
        int i = 0;
        foreach (var g in q)
        {
            r[i] = new Game(g);
            i++;
        }

我假设qList<tblArcadeGame>