Задать вопрос
  • Как реализовать Generic объект из интерфейса?

    @kttotto
    пофиг на чем писать
    В Вашем варианте:
    public interface IRepository<T>
    	{
    		T Create();
    		T Read();
    		T Update();
    		T Delete();
    	}
    
    	public class Repository<T> where T : IRepository<T>
    	{
    		public static Repository<T> CreateRepository()
    		{
    			return new Repository<T>();
    		}
    	}

    Но не думаю, что это верный подход. Потому, что в этом случае, каждая POKO модель должна будет наследоваться от IRepository. Архитектурно не правильно, выглядеть будет следующим образом
    class Program
    {
        static void Main(string[] args)
        {
    		var repository = Repository<Comment>.CreateRepository();
    
            Console.ReadKey();
        }
    }
    
    public class Comment : IRepository<Comment>
    {
    	public int Id { get; set; }
    	public string Name { get; set; }
    
    	public Comment Create()
    	{
    		return this;
    	}
    
    	public Comment Read()
    	{
    		return this;
    	}
    
    	public Comment Update()
    	{
    		return this;
    	}
    
    	public Comment Delete()
    	{
    		return this;
    	}
    }


    Если хотите дженерик репозиторий, могу предложить свой вариант, который я использовал в некоторых своих проектах. При желании адаптируйте его под свои нужды.
    Example
    public interface IRepository where T : class
    {
    IEnumerable GetAll();
    T GetById(int id);
    T Create(T model);
    T Update(T model);
    T Delete(int id);
    }

    public class EFRepository : IRepository where T : class
    {
    protected readonly DbContext _dbContext;

    public EFRepository(DbContext dbContext)
    {
    _dbContext = dbContext;
    }

    public virtual IEnumerable GetAll()
    {
    return _dbContext.Set();
    }

    public virtual T GetById(int id)
    {
    return _dbContext.Set().Find(id);
    }

    public virtual T Create(T model)
    {
    var entity = _dbContext.Set().Add(model);
    return entity;
    }

    public virtual T Update(T model)
    {
    _dbContext.Entry(model);
    return model;
    }

    public virtual T Delete(int id)
    {
    var model = _dbContext.Set().Find(id);
    var entity = _dbContext.Set().Remove(model);
    return entity;
    }
    }

    public interface IPostRepository : IRepository
    {
    IEnumerable GetByUserId(string id);
    }

    public class EFPostRepository : EFRepository, IPostRepository
    {
    public EFPostRepository(DbContext dbContext) : base(dbContext)
    {
    }

    public IEnumerable GetByUserId(string id)
    {
    return _dbContext
    .Posts
    .Where(x => x.UserId == id);
    }
    }
    Ответ написан
    Комментировать
  • Почему не устанавливается библиотека?

    @kttotto
    пофиг на чем писать
    Мало инфы. Какая студия, какие пакеты стоят, в какой проект добавляете?

    В первую очередь проверьте, что нугет менеджер последней версии, обновите его и попробуйте еще раз.
    Ответ написан
    Комментировать
  • Возможно ли оптимизировать структуру таблицы Mysql через сортировку?

    @kttotto
    пофиг на чем писать
    Rsa97 все правильно сказал. Бд может физически хранить данные вовсе не в том порядке как их отображает в таблице по дефолту и сортировка Вам ничего не даст. Для ускорения поиска данных существуют индексы. Делаете из своей связи составной ключ и индексируете все это дело.
    Ответ написан
    Комментировать
  • Как вычислить сумму с факториалами (C# консольное приложение)?

    @kttotto
    пофиг на чем писать
    Присоединяюсь к ответу выше: не плохо бы показать свой вариант, пусть и не рабочий.
    Если не ошибаюсь, с ходу почти псевдокод, наверное как то так
    double P = a = b = 1;
    for(var i = 2; i <= n; i++)
    {
        a = a * (i - 1);
        b = b * (sin(i));
        P = P * (a + b);
    }
    print(P);
    Ответ написан
    Комментировать
  • Как назвать булеву переменную которая указывает делать что-то или не делать?

    @kttotto
    пофиг на чем писать
    В каждом яп свои конвенции. Обычно такие переменные, это флаги, их могут именовать с fValue, могут value_flag, если буловский флаг, то могут начинать с is. Я бы, наверное, назвал isWary.
    Ответ написан
    Комментировать
  • Как решить проблему типов при отношении многие ко многим?

    @kttotto
    пофиг на чем писать
    Все зависит от того как Вы этот value собираетесь использовать.

    Если не нужно будет по нему делать поиск, индексировать, то можно сделать MAX, и в нем же хранить тип значения, что-то вроде {"$type":"int","value":3}

    Если по нему все же надо будет делать выборку, то я бы, наверное, сделал таблицу value с полями для всех возможно нужных типов и в options сделал два поля type и valueId ну и тогда я буду знать строку и колонку, где читать значение в таблице value.
    Ответ написан
  • Как проверить массив на наличие совпадений?

    @kttotto
    пофиг на чем писать
    Накидал пример, получите все айдишники повторных комментариев, которые надо удалить.
    static void Main(string[] args)
    {
        var comments = new[]
        {
             new Comment { Id = 1, Text = "1" },
             new Comment { Id = 2, Text = "2" },
             new Comment { Id = 3, Text = "3" },
             new Comment { Id = 4, Text = "1" },
             new Comment { Id = 5, Text = "2" },
             new Comment { Id = 6, Text = "2" },
             new Comment { Id = 7, Text = "1" },
             new Comment { Id = 8, Text = "4" },
             new Comment { Id = 9, Text = "5" },
             new Comment { Id = 10, Text = "2" },
        };
    
        var result = comments
    				.GroupBy(x => x.Text)
    				.SelectMany(x => x.Select(y => y.Id).Skip(1))
    				.ToArray();
    
        foreach (var id in result)
        {
             Console.WriteLine($"{id}");
        }
        Console.ReadKey();
    }
    
    class Comment
    {
         public int Id { get; set; }
         public string Text { get; set; }
    }
    Ответ написан
    Комментировать
  • Загрузка картинок на сервер?

    @kttotto
    пофиг на чем писать
    Зависит от размера картинок. Можно все картинки в base64 и одним массивом за запрос отдать. Можно и стандартным способом все картинки за раз отдать.
    Ответ написан
  • Как заставить работать пагинацию используя PartialView() с Ajax.BeginForm()?

    @kttotto
    пофиг на чем писать
    Ну так Вы фильтруете данные только при загрузке страницы, а в Summary фильтрации нет, Вы берете все Furnitures и только сортируете, поэтому при клике на другую страницу выдаст все что у Вас есть. Попробуйте вынести фильтрацию из List в отдельный метод и применить ее так же и к result в Summary.
    Ответ написан
    6 комментариев
  • Методы-индексаторы в чем суть если можно использовать расширенные колекции?

    @kttotto
    пофиг на чем писать
    В Вашем примере логика индексатора проста, поэтому смысл не виден.

    Приведу пример из жизни. Мне надо было хранить и отображать данные в виде, где в первой строке одно значение, во второй строке два значения, в третьей - три и т.д. Отображались в ui они в виде пирамиды. Первая мысль, это квадратный двумерный массив по размеру самой большой последней строки и пустое пространство вершины забить нолями. Отобразить такой массив пирамидой легко. Но тогда у меня возникала трудность в работе с этим массивом, т.к. чтобы забрать нужные значения, нужно правильно отсекать пустые значения, да и как-то не комильфо кучу не нужных значений хранить. Следом приходит мысль сделать массив массивов с разной длинной, но чтоб сделать итерацию по такому массиву, а потом отобразить, нужно тоже лишние телодвижения делать. И тогда я сделал обычный список, где данные хранились в порядке как 1, 21, 22, 31, 32, 33 и т.д., но приделал ему индексатор [ , ], где я указывал строку и положение в строке, а логика этого индексатора уже высчитывала реальное значение элемента: ноль (т.е. пустое пространство у верхушки пирамиды) или значение из списка.
    Во первых я решил проблему лишних значений, во вторых, по данным я мог пройтись одним форичем, а не вложенными форами, без проверок лишних значений и в третьих - отображалось также легко как и двумерный массив.
    Ответ написан
    Комментировать
  • Как создать документ Word с таким форматированием на C#?

    @kttotto
    пофиг на чем писать
    Работа из кода с документами office легко гуглится. Например Интерфейс Document.
    Так же в интернете полно примеров по форматированию док файлов How to: Programmatically Format Text in Documents.
    Готовый код никто здесь не даст, это достаточно объемно скрупулезно.
    Ответ написан
    Комментировать
  • Как оптимизировать код?

    @kttotto
    пофиг на чем писать
    Не стоит городить огород из ничего или иначе overhead. У Вас все нормально, только нужно учесть в паре мест возможность эксепшина. Это при приведении as может вернуть null и при чтении ключа, его может не быть.
    var item = lstTasks.SelectedItem as DataRowView;
    if(item == null)
        return throw new NullReferenceExeption(nameof(item));
    var resultId = item.TryGetValue("id", out int id);
    var resultName = item.TryGetValue("name", out string name);
    if(resultId && resultName)
        DeleteTask(id.ToString(), name);
    Ответ написан
    1 комментарий
  • Visual Studio, как делать несколько проектов?

    @kttotto
    пофиг на чем писать
    как я понимаю самой Visual Studio

    Нужно не предполагать, а выяснить точно. Может Вы внутри своего проекта запускаете еще процессы, которые используют этот файл и Вы не определили на него диспоуз с закрытием процесса. Может как то кастомно используете орм, где при завершении работы проекта не закрывается соединение с бд.

    Я склоняюсь к тому, что у Вас в проекте есть запущенные процессы, которые надо бы руками в коде закрыть перед выходом из приложения.
    Ответ написан
    Комментировать
  • Как избежать записывания во внешнюю переменную?

    @kttotto
    пофиг на чем писать
    Вам нужно использовать то значение, которое вернет getWizards(), а не то, что внутри него.
    var wizards = getWizards(numberOfWizards);
    ...
    for (var i = 0; i < wizards.length; i++) {
      fragment.appendChild(renderWizard(allWizards[i]));
    }
    Ответ написан
  • Как правильно удалить элемент из коллекции в C# 6?

    @kttotto
    пофиг на чем писать
    Проходите по коллекции с конца через for, доступ к элементам через индексатор. На коленке, просто чтоб смысл был понятен, что-то типа этого
    for(var i = arr.Count - 1; i >= 0; i--)
    {
         if(arr[i].Name == "Any")
         {
             arr.RemoveAt(i);
         }
    }

    Ну и на всякий случай, у linq есть метод RemoveAll
    arr.RemoveAll(x => x.Name == "Any");
    А еще можно вернуть новую коллекцию, где не будет этого значения
    arr.Where(x => x.Name != "Any");
    По смыслу это будет тоже самое. Но в первом варианте, для удаления, Вам не придется создавать копии коллекций, ибо варианты с linq вернут новые списки. Особенно это актуально когда нужно избежать лишние алокации, если Ваш список внушителен по объему.
    Ответ написан
    Комментировать
  • Как разделить строку на символы и записать сразу этот символ в массив?

    @kttotto
    пофиг на чем писать
    На вскидку
    Вы получили массив символов myarr_0[i].ToCharArray()
    Затем Вы хотите массив привести к инту, это для платформы не понятно, поэтому даст эксепшн.
    Зачем делать лишние преобразования, если у Вас уже есть массив, сделайте просто
    array[i] = myarr_0[i].ToCharArray();
    Ответ написан
    3 комментария
  • Почему не получается остановить анимацию?

    @kttotto
    пофиг на чем писать
    Дайте ссылку в исходном коде где именно код в том варианте, как привели. То, что я увидел в коде и в Вашем примере, это не одно и тоже. В исходнике запускается и останавливается таймер. Ваш пример вырван из контекста, поэтому по нему трудно что-то понять.

    С гитхаба Ваш код себе не клонировал, но заметил, что ChebyshevMachine это структура, а не класс. Не знаю причины такого выбора, но могу предположить, что именно в этом может быть проблема. Поставьте брейкпоинт на методе StopAnimation и проверьте, что это тот же объект на котором Вы запустили таймер.
    Ответ написан
    2 комментария
  • Почему карусель перестаёт работать после перезагрузки страницы?

    @kttotto
    пофиг на чем писать
    Проблема в кешировании страницы. Если перезапускать страницу через контрол+F5, то все отрабатывает нормально. Обход кеширования решается несколькими способами, погуглите, какой под Вашу задачу подойдет.
    Ответ написан
    Комментировать
  • Как убрать перенос строки, появляющийся при копировании из HTML?

    @kttotto
    пофиг на чем писать
    Выделяйте не всю строку сразу, а через зажатую левую кнопку мыши (ну или шифт + стрелочка). На конце строки есть не отображаемый символ переноса, когда выделяется вся строка целиком, то в буфер попадает и этот символ.
    Ответ написан
  • Как сделать деконструктор класса?

    @kttotto
    пофиг на чем писать
    Во первых не совсем понятно какой деструктор Вы хотите. Если такой как в С++, то в C# такого нет по причине существования GC. Если Вы хотите метод, который будет выполняться перед сборкой мусора, то нужно реализовать IDisposable. И даже если Вы явным образом вызовите Finalize, то в какой момент он выполнится, никто гарантии не даст, как GC решит.

    Во вторых, C# язык строго типизированный, а значит нужно каким то образом ему понимать, какого типа будет headerA и headerB. Значит для них нужно определить тип
    class HeaderA
    {
          public string Signature {get;set;}
          public DateTime CreatedDate {get;set;}
          public int Version {get;set;}
    }
    
    class HeaderB
    {
          public string Signature {get;set;}
          public DateTime CreatedDate {get;set;}
          public long AuthorId {get;set;}
          public string MagicString {get;set;}
    }

    затем инкапсулируете их
    public class A<TData>
    {
      //header
      public HeaderA Header {get;set;}
      //data
      public TData Data {get;set;}
    }
    
    public class B<TData>
    {
      //header
      public HederB Header {get;set;}
      //data
      public TData Data {get;set;}
    }

    Видно, что можно еще обобщить и сделать
    class HederData<THeder, TData>
    {
          public THeder Header {get;set;}
          public TData Data {get;set;}
    }

    Теперь объекты можно создавать таким образом
    var a = new DataHaeder<HeaderA, string>();
    var b = new DataHeader<HeaderB, int>();

    Ну вот собственно мы и получили объект с полями, какими Вы хотите
    (var headerA, dataA)
    a.Header и a.Data, b.Header и b.Data;

    И, кстати, общие поля можно вынести в один класс
    class CommonProp
    {
          public string Signature {get;set;}
          public DateTime CreatedDate {get;set;}
    }

    А потом хедеры от него отнаследуйте.
    class HeaderA : CommonProp
    {
          public int Version {get;set;}
    }
    
    class HeaderB : CommonProp
    {
          public long AuthorId {get;set;}
          public string MagicString {get;set;}
    }
    Ответ написан