Ответы пользователя по тегу ООП
  • Как оптимизировать код?

    @carbon88
    .NET developer/ORM developer
    Добавлю свою ложку дегтя плюсом к предыдущим ответам

    1) query.Count() > 0 если это метод из Linq а не определенный в классе то лучше так не делать. Он переберет весь IEnumerable, а оно вам надо? Если нужно проверить есть ли в последовательности элементы используйте query.Any()

    2)в if-ах можно определить только запрос. а далее просто
    if (query.Any())
    {
       ViewData["uncheckedProfiles"] = query.ToPagedList(pageNumber, pageSize);
    }
    else
    {
       ViewData["uncheckedProfilesSearch"] = "NoResult";
    }

    или

    3) думаю можно что-то сделать с вашими ToUpper(). например почему бы сразу не привести все что нужно (если оно нужно) к верхнему регистру и не делать лишних операций. потому что судя по описанию на MSDN ToUpper() выдает копию строки, то есть это как минимум каждый раз инициализация переменной и копирование из одной переменной в другую. А вообще почитайте про работу со строками с точки зрения внутреннего устройства, например рихтера "CLR via C#"

    4) вообще судя по вашему запросу у вас рознится только часть Where. в остальном это один и тот же Linq. То есть можно написать все красивее, пошагово определив все состовляющие.

    var query = MongoDBInstance.GetMongoDatabase.GetCollection<User>("UserInfo")
        .AsQueryable<User>();
    if (!string.IsNullOrEmpty(searchByName)) {
        var upperCaseSearchString = searchByName.ToUpper()
        string[] names = upperCaseSearchString.Split(' ');
        if (names.Length > 1) {
             query = query.Where(i=>
                                !i.IsActivated && ((
                                    i.Name.ToUpper().Contains(names[0]) &&
                                    i.LastName.ToUpper().Contains(names[1])) ||
                                (i.Name.ToUpper().Contains(names[1]) &&
                                 i.LastName.ToUpper().Contains(names[0]))));
        }
        else {
            query = query.Where(i=>
                                !i.IsActivated && (
                                    i.Name.ToUpper().Contains(upperCaseSearchString) ||
                                    i.LastName.ToUpper().Contains(upperCaseSearchString)));
              
        }
    }
    else {
        query = query.Where(i=>!i.IsActivated);
    }
    query = query.OrderBy(i=>i.ID);
    if (query.Any()) {
        ViewData["uncheckedProfiles"] = query.ToPagedList(pageNumber, pageSize);
    }
    else {
        ViewData["uncheckedProfilesSearch"] = "NoResult";
    }


    За скобки не ручаюсь, писал прям в редакторе тостера
    Ответ написан
    2 комментария