• Работа с Dictionary в c# - как получить данные в массиве?

    @AlexP11223
    Использовали бы лучше SQLite провайдера для стандартного ADO.NET, например https://system.data.sqlite.org

    Как мне в цикле получить все данные из DataTable?

    У Dictionary можно получить массив значений через Values. Или массив KeyValuePair через ToArray(), ToList() или просто цикл foreach.

    То есть видимо например как-то так:
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        foreach (var value in dt.Rows[i].Values)
        {
            //Console.WriteLine(value);
        }
    }


    Порядок значений в Values не гарантирован (но такой же как и у ключей Keys), то есть может отличаться от того, как у вас было в таблице БД.
    Так что вероятно больше смысла делать что-то типа такого:
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        foreach (var kv in dt.Rows[i])
        {
            //Console.WriteLine("Column: " + kv.Key + ", value: " + kv.Value);
        }
    }
    Ответ написан
    1 комментарий
  • Как вставить файлы в проект и их запускать?

    aush
    @aush
    Вопрос в том, насколько сильно вы хотите защититься от возможности запуска этой программы без аутентификации.

    Я так понимаю, вам бы хотелось, чтобы все файлы вашей сторонней программы каким-то образом бы оказались "встроены" в вашу программу. Это возможно - вы всегда можете просто добавить файлы в бинарном виде как ресурсы. Но в конечном счете, т.к. вы пишите на шарпе, злоумышленник может изучить исходный код вашей программы для показа формы авторизации, понять, как вы из нее запускаете стороннее приложение и запустить его.

    Если же вам нужна "защита от дурака", то просто поменяйте расширение у exe-файла - обычный юзер не догадается, что это приложение и его можно запускать, а вам это не помешает выполнят запуск этого приложения.
    Ответ написан
    Комментировать
  • C# - как организовать множественное наследование?

    FirstX
    @FirstX
    .net developer
    Задача конечно жесть, действительно очень сложно понять конечную цель ваших манипуляций (а мотивацию для чего вы это делаете). Но немного теории на счет того, что тут происходит.

    Есть AutoCommon и есть ряд наследников У AutoCommon есть свойство DSV, и у AutoA мы снова видим определение свойства DSV. В этот момент, компилятор неявно считает, что это абсолютно новое свойство, никак не связанное с родительским (каждый остается при своем свойстве). То есть то, что написано у вас на самом деле выглядит так

    public class autoA : autoCommon{
    	public autoA(){
    		this.dvs = new dvsDizel();
    	}
         public new dvsDizel dvs {get;set;}
    
    }


    Теперь идем в конструктор и понимаем, что объект создается только для DSV, который объявлен в дочернем классе. В родительском он как был пустой, таким и остается, о нем мы ничего не говорили.

    Теперь когда мы делаем так:

    AutoCommon auto = new AutoA();
    WriteLine(auto.dsv.a);

    Что мы видим? Правильно, ничего. Почему? Да потому что мы пытаемся обратиться к свойству, которое принадлежит родительскому классу, а мы его и не создавали никогда (точнее экземпляр объекта для свойства), мы создавали свойство дочернего объекта.

    Перепишем пример так:

    public class autoA : autoCommon{
    	public autoA(){
    		base.dvs = new dvsDizel();
    	}
         public new dvsDizel dvs {get;set;}
    
    }


    Теперь мы создаем экземпляр объекта не для дочернего объекта, а именно для родителя.
    После этого пример выше, выведет нам то, что вы видимо хотели, то есть строку с текстом.
    НО при таком вызове:

    AutoA auto = new AutoA();
    WriteLine(auto.dsv.a);

    Вы опять получите эксепшен с null. Почему ? Да потому что вы обращаетесь к свойству уже дочернего объекта, которое в этот раз мы оставили пустым)

    Итого: вы имете 2 свойства в дочернем объекте (родительское и "свое") с одинаковым именем. Чтобы обратиться к родительскому используете base.* , чтобы обратиться к своему можно явно через this.*, либо this можно опустить.

    public class autoA : autoCommon{
    	public autoA(){
    		base.dvs = new dvsDizel();
                   this.dvs = base.dsv;
    	}
         public new dvsDizel dvs {get;set;}
    
    }


    В данном варианте они теперь ссылаются на один и тот же объект, но обращаясь по родительскому типу данных вы сможете получать общие методы dsv, а если сделаете приведение типов к конкретному классу AutoA, то сможете вызывать методы DvsDizel.
    Ответ написан
    9 комментариев