Как убрать повторяющийся код в этом методе? - PullRequest
3 голосов
/ 19 ноября 2011
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;
}

Я не могу определить q вне области действия if, и я не могу вставить возвращаемые значения в массив вне области действия if!Не знаете, как удалить повторяющийся код в этом простом экземпляре?

Ответы [ 4 ]

4 голосов
/ 19 ноября 2011

Непонятно, что это за тип q, но исходя из вашего использования:

db.tblArcadeGames.OrderByDescending(...)

Предположительно, это класс сущностей из Linq-To-Sql или Entity Framework.В этом случае у вас do определена конкретная сущность, предположительно названная 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++;
}

Как видите, повторный код теперь виден только один раз.

PS Такие инструменты, как ReSharper, прекрасно подходят для такого рода вещей.Используя его, одним нажатием клавиши вы можете переключаться между версией var и версией с явно именованными типами.

1 голос
/ 19 ноября 2011

Я предполагаю, что 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();
}
1 голос
/ 19 ноября 2011

Вы действительно должны просто явно ввести 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++;
}
0 голосов
/ 19 ноября 2011
    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++;
        }

Я предполагаю, что q равно List<tblArcadeGame>

...