Ответы пользователя по тегу C#
  • ThreadPool vs Thread - многопоточный TCP сервер?

    @kttotto
    пофиг на чем писать
    Используя в чистом виде thread Вам придется руками контролить множество нюансов, когда в TPL это все сделается за Вас. Рекомендуется использовать TPL.
    Ответ написан
    Комментировать
  • Как правильно отправлять почту с вложением?

    @kttotto
    пофиг на чем писать
    Проблема может быть в почтовике, он может письмо с html вложениями интерпретировать как спам, опасное и т.д. В настройках своей почты попробуйте поснимать галочки всяких проверок и фильтров. Можете поискать письмо в папке со спамом.
    Ответ написан
    1 комментарий
  • Вопросы по авторефакторингу в Visual Studio 2017 Community. В чем разница?

    @kttotto
    пофиг на чем писать
    Никакого, это даже не лямбда выражение, это просто синтаксический сахар для стиля написания. Так же как и в свойствах Prop {get;set;} => "..."
    Ответ написан
    Комментировать
  • Как избавится от A call to PInvoke function unbalanced the stack?

    @kttotto
    пофиг на чем писать
    Надо смотреть как Вы скомпилировали саму функцию. Думаю разница в соглашениях, CallingConvention.Cdecl. Может она скомпилирована как stdcall?
    Вот подобный вопрос
    Ответ написан
    1 комментарий
  • Как провести удаление функции в c#?

    @kttotto
    пофиг на чем писать
    Я думаю не совсем верно вопрос задан.

    Если Вы хотите именно добавлять и удалять методы на объекте, то Вам нужны делегаты. Сделаете поле у карты типа делегата, который объявите и потом этому полю меняйте методы, либо обнуляйте на метод, который ничего не делает. Можете взять готовые типы делегатов тут.

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

    @kttotto
    пофиг на чем писать
    Обычным if-else эта задача не решится. Это попадание точки в полигон. Если полностью описывать алгоритм, то нужно перебрать вектора (два соседних элемента в массиве, это один вектор) и смотреть с какой стороны вектора эта точка находится. Иначе говоря, при движении по оси Х пересекает она вектор или нет. Для этого используется косое умножение векторов. Суммируем и смотрим, если точка пересекла четное количество раз векторы, то она не входит в полигон, если не четное - попадает в площадь полигона.

    Это мой работающий код, модели из GeoJSON.Net
    public bool IsBelong(Point point, IGeometryObject geoGeometry)
    {
    	var polygon = ((Polygon) geoGeometry).Coordinates;
    
    	var inPolygon = false;
    
    	var x = point.Coordinates.Latitude;
    	var y = point.Coordinates.Longitude;
    
    	var points = polygon[0].Coordinates;
    
    	for (var i = 0; i < points.Count - 1; i++)
    	{
    		if (((points[i + 1].Longitude > y) != (points[i].Longitude >= y)) 
    				&& 
    			(x < (points[i].Latitude - points[i + 1].Latitude) * (y - points[i + 1].Longitude) / (points[i].Longitude - points[i + 1].Longitude) + points[i + 1].Latitude))
    		{
    			inPolygon = !inPolygon;
    		}
    	}
    	return inPolygon;
    }
    Ответ написан
    Комментировать
  • Как работает рекурсия при итерации?

    @kttotto
    пофиг на чем писать
    yield return всего лишь запоминает текущее положение итератора. Поэтому yield return current.value будет возвращать одно и тоже значение, первое, т.к. Вы не итерируетесь по коллекции traverse(node), нет методов, которые сделают MoveNext(). Посмотрите на вариант Михаил Макаров, там итерация происходит с помощью foreach.
    Ответ написан
    Комментировать
  • C# Replace по порядку?

    @kttotto
    пофиг на чем писать
    Дарю! И вообще учи мат часть, за счет халявы на тостере долго не протянешь.
    static void Main(string[] args)
    {
    	var str = "{1|2|4}{1|3|3}{2|2|3}{1|1|3}";
    	var number = new [] { "3", "2", "1", "2" };
    
    	var temp = str
    		.Trim('{', '}')
    		.Split(new []{ "}{" }, StringSplitOptions.None)
    		.Select(x => x.Split('|').ToArray())
    		.ToArray();
    
    	var result = new StringBuilder();
    	for (var i = 0; i < temp.Length; i++)
    	{
    		var isParse = int.TryParse(number[i], out int index);
    		if (isParse)
    		{
    			result.Append(temp[i][index - 1]);
    		}
    	}
    
    	Console.WriteLine(result);
    	Console.ReadKey();
    }
    Ответ написан
    8 комментариев
  • Наследование, или же как использовать переменную одного наследует ого класса в другом наследует классе?

    @kttotto
    пофиг на чем писать
    Передать его как параметр либо через конструктор второго класса, либо через один из его методов.
    abstract class A
    {
    	protected string _value;
    }
    
    class B : A
    {
    	// Через общее отнаследованное поле
    	public string ValueB { get { return _value; } set { _value = value; } }
    }
    
    class C : A
    {
    	private string _valueC;
    	
    	public C(string any)
    	{ }
    	
    	// Через конструктор
    	public C(string any)
    	{
    		_valueC = any;
    	}
    	
    	public string ValueC { get { return _value; } set { _value = value; } }
    	
    	// Через метод
    	public void SetMethod(string any)
    	{
    		_valueC = any
    	}
    }
    
    var b = new B();
    var c = new C();
    b.ValueB = "any"; // c.ValueC = "any"
    // так же как и
    c.ValueC = "any"; // b.ValueB = "any"
    
    b.ValueB = "any";
    // Через конструктор
    var c = new C(b.ValueB); 
    // Через метод
    c.SetMethod(b.ValueB);
    Ответ написан
    1 комментарий
  • Как правильно настроить smtp для email рассылок?

    @kttotto
    пофиг на чем писать
    Если конкретно по Вашему коду, то
    1. Если Вы так жестко прописываете все настройки в коде, то сделайте список настроек. Сначала сам класс
    class SmtpSetting
    {
    	public string Host {get; set;}
    	public string Server {get; set;}
    	public string Port {get; set;}
    }

    Потом сам список
    var smptSettings = new List<SmptSetting>
    {
    	new SmptSetting
    	{
    		Host = "mail.ru",
    		Server = "smtp.mail.ru",
    		Port = 587
    	},
    	new SmptSetting
    	{
    		Host = "yahoo.co",
    		Server = "smtp.yahoo.co",
    		Port = 465
    	},
    	...
    }

    И тогда Вам не придется использовать switch
    var currentSmtp = smptSettings.FirstOrDefault(x => x.Host == host);
    if(currentSmtp != null)
    {
    	var smtp = new SmtpClient(currentSmtp.Server, currentSmtp.Port);
    }

    Вы сказали, что у Вас есть бд, где храните аккаунты. Храните там же и настройки smtp, в том же виде (Id,Host,Server,Port), тогда из бд Вы будете получать весь список серверов и при изменении списка настроек smtp, не придется лезть в код и пересобирать проект.

    2. И для того, чтобы Вы могли вставлять html разметку в письмо, у MailMessage есть настройка IsBodyHtml, установите ее в true.
    Ответ написан
    1 комментарий
  • Как реализовать 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
    пофиг на чем писать
    Мало инфы. Какая студия, какие пакеты стоят, в какой проект добавляете?

    В первую очередь проверьте, что нугет менеджер последней версии, обновите его и попробуйте еще раз.
    Ответ написан
    Комментировать
  • Как вычислить сумму с факториалами (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
    пофиг на чем писать
    Накидал пример, получите все айдишники повторных комментариев, которые надо удалить.
    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; }
    }
    Ответ написан
    Комментировать
  • Как заставить работать пагинацию используя 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

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

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