Общие вопросы по разработке > OT: вопрос по C#

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
BugsDigger
Сообщения: 533
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 91 раз

OT: вопрос по C#

Непрочитанное сообщение BugsDigger » 19 фев 2019, 12:07

Привет всем.

Помогите, плиз, начинающему.
Вот разбор входного файла, где д. лежать строки вида #key=val, в словарь:

Код: Выделить всё

Dic=System.IO.File.ReadLines(FileName)
                       .Where(line => { line=line.Trim(); return line.StartsWith("#") && line.Contains("="); })
                       .Select(line => line.Split(new[] { "#", "=" }, StringSplitOptions.RemoveEmptyEntries))
                       .ToDictionary(lines => lines[0].Trim(), lines => lines[1].Trim());

Это работает, но хочется сделать дополнительные проверки.
Что и как добавить перед последним ToDictionary, чтобы убедиться:
1) в lines ровно 2 строчки (иначе пропустить)
2) они не из пробелов, т.е не станут после Trim пустыми
3) ключ корректный (не будет исключения при добавлении в словарь)

Или это невозможно в такой "цепочечной" конструкции?

ensh
Сообщения: 218
Зарегистрирован: 28 июн 2017, 13:56
Благодарил (а): 4 раза
Поблагодарили: 39 раз

Re: OT: вопрос по C#

Непрочитанное сообщение ensh » 19 фев 2019, 17:44

Код: Выделить всё

.Where(line => line.Length==2 && !string.IsNullOrEmpty(line[0]) && !string.IsNullOrEmpty(line[1])
// && тут еще какая-нибудь нечеловеческая логика...
)



Dictionary - любую строку сожрет...

BugsDigger
Сообщения: 533
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 91 раз

Re: OT: вопрос по C#

Непрочитанное сообщение BugsDigger » 19 фев 2019, 17:57

ensh писал:

> еще какая-нибудь нечеловеческая логика

Спасибо за подсказку, вроде все просто, но я в подобном стиле (действительно несколько "нечеловеческой логики" ) пока не мыслю, но, видимо, привыкну постепенно. :) Ну и я ж в АД пишу, подсказки от IDE ждать не приходится...

> любую строку сожрет

Да, если только не окажется дублирования или пустого ключа; тады исключение будет.

ensh
Сообщения: 218
Зарегистрирован: 28 июн 2017, 13:56
Благодарил (а): 4 раза
Поблагодарили: 39 раз

Re: OT: вопрос по C#

Непрочитанное сообщение ensh » 19 фев 2019, 19:52

Для фильтрации дублироваия ключей нужно, но это уже в чистом C# коде:
1. объявить свой компаратор

Код: Выделить всё

        class DistinctComparer : IEqualityComparer<string[]>
        {
            public bool Equals(string[] x, string[] y)
            {
                return x[0] == y[0];
            }

            public int GetHashCode(string[] obj)
            {
                return obj[0].GetHashCode();
            }
        }


2. использовать компаратор, перед ToDictionary

Код: Выделить всё

.Distinct(new DistinctComparer())

BugsDigger
Сообщения: 533
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 91 раз

Re: OT: вопрос по C#

Непрочитанное сообщение BugsDigger » 20 фев 2019, 06:58

OK, спасибо.

> это уже в чистом C# коде

Да, в АД не проканает.

Ну а вообще, в этой "цепочечной" системе явно не все можно сделать, как хочется, на определенном этапе лучше остановиться и написать "руками". :)


Вернуться в «Общие вопросы по разработке»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 19 гостей