Понятна ли эта строчка кода? Как лучше записать?
От: Shmj Ниоткуда  
Дата: 17.08.19 12:44
Оценка:
string[] clientDataKeyNames = new string[] {"a", "b"};

var dataKeyValues =
                clientDataKeyNames.Skip(1).Aggregate(
                    clientDataKeyNames.Any() ? $"[\"{clientDataKeyNames.First()}\"" : "[",
                    (a, next) => a + $",\"{next}\"", a => a + "]");
Re: Понятна ли эта строчка кода? Как лучше записать?
От: Jack128  
Дата: 17.08.19 13:24
Оценка: 7 (2) +4
Здравствуйте, Shmj, Вы писали:

S>
S>string[] clientDataKeyNames = new string[] {"a", "b"};

S>var dataKeyValues =
S>                clientDataKeyNames.Skip(1).Aggregate(
S>                    clientDataKeyNames.Any() ? $"[\"{clientDataKeyNames.First()}\"" : "[",
S>                    (a, next) => a + $",\"{next}\"", a => a + "]");
S>


Ну усилием воли можно конечно разобраться, но ИМХО в разы понятнее так:

dataKeyValues = "[" + string.Join(", ", clientDataKeyNames.Select(x => $"\"{x}\"")) + "]";
Re[2]: Понятна ли эта строчка кода? Как лучше записать?
От: Shmj Ниоткуда  
Дата: 17.08.19 14:06
Оценка: :)
Здравствуйте, Jack128, Вы писали:

J>
J>dataKeyValues = "[" + string.Join(", ", clientDataKeyNames.Select(x => $"\"{x}\"")) + "]";
J>


Это вы сходу написали или же сталкивались и написали по опыту? Зарабатываете более $2500?
Re[3]: Понятна ли эта строчка кода? Как лучше записать?
От: Jack128  
Дата: 17.08.19 14:46
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, Jack128, Вы писали:


J>>
J>>dataKeyValues = "[" + string.Join(", ", clientDataKeyNames.Select(x => $"\"{x}\"")) + "]";
J>>


S>Это вы сходу написали или же сталкивались и написали по опыту?

по опыту я знаю о существовании метода string.Join. Хотя ИМХО методы столь базового класса как string имеет смысл просмотреть вообще каждому кто пишет под .NET

S>Зарабатываете более $2500?

Нет.
Re[3]: Понятна ли эта строчка кода? Как лучше записать?
От: Mystic Artifact  
Дата: 17.08.19 15:40
Оценка:
Здравствуйте, Shmj, Вы писали:

J>>
J>>dataKeyValues = "[" + string.Join(", ", clientDataKeyNames.Select(x => $"\"{x}\"")) + "]";
J>>

S>Это вы сходу написали или же сталкивались и написали по опыту? Зарабатываете более $2500?
А зарплата то как связана с вопросом?

Вообще string.Join, есть даже в яваскрипте (array.join), и питоне. Он в тыщупицот раз легче читается, чем, Aggregate, да и работает скорее всего быстрее. В яваскрипте и питоне вообще прием с array.join("") это такой почти стандартный аналог StringBuilder. На этой основе можно даже сделать простенький движок шаблонов, который будет биндить значения на предварительно посчитанные индексы. При чем, в JS — это один из самых простых и быстрых способов (ну конечно, массив из миллиона элементов делать не стоит).

В реальном, библиотечном коде, я бы еще избавился от интерполяции строк, т.к. она использует, текущую культуру. Для конкатенации строк, это должно быть не важно, а для других типов может быть важно — легче иметь единообразный стиль, чем там так, а тут эдак. Да и наличие квадратных скобок намекает на генерацию какого-то синтаксиса, а он пр всей видимости требует экранировать строки. Таким образом и тот и тот вариант выродится в отдельный конструкт, который всем этим занимается.
Re[2]: Понятна ли эта строчка кода? Как лучше записать?
От: alexzzzz  
Дата: 21.08.19 14:12
Оценка: +1
Здравствуйте, Jack128, Вы писали:

J>Ну усилием воли можно конечно разобраться, но ИМХО в разы понятнее так:


J>
J>dataKeyValues = "[" + string.Join(", ", clientDataKeyNames.Select(x => $"\"{x}\"")) + "]";
J>


Если разбить на две отдельные строки, будет сходу ещё понятнее. А то слишком много весёлых значков вряд.
Re[4]: Понятна ли эта строчка кода? Как лучше записать?
От: Mihas  
Дата: 21.08.19 14:39
Оценка:
Здравствуйте, Jack128, Вы писали:

J>по опыту я знаю о существовании метода string.Join

А нет опыта сравнения производительности string.Join() и Agregate<string>()?
Сам специально не искал. Мне кажется, первый должен быть более заточен.
Re[2]: Понятна ли эта строчка кода? Как лучше записать?
От: koodeer  
Дата: 21.08.19 15:05
Оценка:
Здравствуйте, Jack128, Вы писали:

dataKeyValues = "[" + string.Join(", ", clientDataKeyNames.Select(x => $"\"{x}\"")) + "]";


Можно ещё проще:

var dataKeyValues = "[\"" + string.Join("\",\"", clientDataKeyNames) + "\"]";
Re: Понятна ли эта строчка кода? Как лучше записать?
От: koodeer  
Дата: 21.08.19 15:08
Оценка: 14 (3) +1
Здравствуйте, Shmj, Вы писали:

S>string[] clientDataKeyNames = new string[] {"a", "b"};

S>var dataKeyValues =
S>                clientDataKeyNames.Skip(1).Aggregate(
S>                    clientDataKeyNames.Any() ? $"[\"{clientDataKeyNames.First()}\"" : "[",
S>                    (a, next) => a + $",\"{next}\"", a => a + "]");


На выходе получается json.
Если в проекте приходится работать с json, то берём какую-нибудь библиотеку, например, JSON.NET.
Пишем:
var dataKeyValues = JsonConvert.SerializeObject(clientDataKeyNames);
Re[2]: Понятна ли эта строчка кода? Как лучше записать?
От: Shmj Ниоткуда  
Дата: 21.08.19 18:24
Оценка:
Здравствуйте, koodeer, Вы писали:

K>
K>var dataKeyValues = JsonConvert.SerializeObject(clientDataKeyNames);
K>


Все гениальное — просто. Но не хотелось тащить доп. библиотеку, не люблю когда ради 1 строчки целая либа.
Re[3]: Понятна ли эта строчка кода? Как лучше записать?
От: Ночной Смотрящий Россия  
Дата: 22.08.19 11:57
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Все гениальное — просто. Но не хотелось тащить доп. библиотеку, не люблю когда ради 1 строчки целая либа.


В Core 3 System.Text.Json — искаропки
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[3]: Понятна ли эта строчка кода? Как лучше записать?
От: · Великобритания  
Дата: 22.08.19 16:08
Оценка:
Здравствуйте, koodeer, Вы писали:

K>Можно ещё проще:

Только не работает для пустой коллекции.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Понятна ли эта строчка кода? Как лучше записать?
От: · Великобритания  
Дата: 22.08.19 16:12
Оценка: +2
Здравствуйте, Shmj, Вы писали:

K>>
K>>var dataKeyValues = JsonConvert.SerializeObject(clientDataKeyNames);
K>>

S>Все гениальное — просто. Но не хотелось тащить доп. библиотеку, не люблю когда ради 1 строчки целая либа.
Вот только все остальные приведённые тут варианты забыли заэкранировать спецсимволы в значениях, добавив не только прикольные баги, но и вероятно дыру в безопасности.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Понятна ли эта строчка кода? Как лучше записать?
От: vl690001x2  
Дата: 22.08.19 16:17
Оценка: :)
Здравствуйте, Jack128, Вы писали:

S>>Это вы сходу написали или же сталкивались и написали по опыту?

J>по опыту я знаю о существовании метода string.Join.

Черт, изучал C# в 2008 по книге, и видать, пропустил этот метод, давно написал уже аналогичный метод в библиотеке утилит, которую пихаю во все проекты.
Как говорится, век живи, век учись.
Re: Понятна ли эта строчка кода? Как лучше записать?
От: meadow_meal  
Дата: 22.08.19 21:31
Оценка:
Здравствуйте, Shmj, Вы писали:

S>
S>string[] clientDataKeyNames = new string[] {"a", "b"};

S>var dataKeyValues =
S>                clientDataKeyNames.Skip(1).Aggregate(
S>                    clientDataKeyNames.Any() ? $"[\"{clientDataKeyNames.First()}\"" : "[",
S>                    (a, next) => a + $",\"{next}\"", a => a + "]");
S>


Первые три этапа обучения функциональному программированию:
1) научиться использовать рекурсию
2) научиться не использовать рекурсию и использовать свертку
3) научиться не использовать свертку
Re: Понятна ли эта строчка кода? Как лучше записать?
От: vaskir Россия vaskir.blogspot.com
Дата: 23.08.19 09:29
Оценка: -1
let clientDataKeyNames = [ "a"; "b" ]

let dataKeyValues =
    clientDataKeyNames
    |> Seq.map (sprintf "\"%s\"")
    |> String.concat ","
    |> sprintf "[%s]"
Re[4]: Понятна ли эта строчка кода? Как лучше записать?
От: Max Mustermann  
Дата: 23.08.19 12:31
Оценка:
Здравствуйте, ·, Вы писали:

·>Здравствуйте, koodeer, Вы писали:


K>>Можно ещё проще:

·>Только не работает для пустой коллекции.

Работает.
А вот Aggregate<string> действительно падает на пустой коллекции.
Re[5]: Понятна ли эта строчка кода? Как лучше записать?
От: · Великобритания  
Дата: 23.08.19 12:39
Оценка:
Здравствуйте, Max Mustermann, Вы писали:

K>>>Можно ещё проще:

MM>·>Только не работает для пустой коллекции.
MM>Работает.
Если "работает" понимать "не падает", то да. Но для пустой коллекции оно выдаст [""] вместо ожидаемого в json []. Весёлой отладки!

MM>А вот Aggregate<string> действительно падает на пустой коллекции.

Уж лучше падать, чем выдавать что попало.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: Понятна ли эта строчка кода? Как лучше записать?
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.09.19 04:53
Оценка:
Здравствуйте, Jack128, Вы писали:

J>Здравствуйте, Shmj, Вы писали:


S>>
S>>string[] clientDataKeyNames = new string[] {"a", "b"};

S>>var dataKeyValues =
S>>                clientDataKeyNames.Skip(1).Aggregate(
S>>                    clientDataKeyNames.Any() ? $"[\"{clientDataKeyNames.First()}\"" : "[",
S>>                    (a, next) => a + $",\"{next}\"", a => a + "]");
S>>


J>Ну усилием воли можно конечно разобраться, но ИМХО в разы понятнее так:


J>
J>dataKeyValues = "[" + string.Join(", ", clientDataKeyNames.Select(x => $"\"{x}\"")) + "]";
J>

В обоих вариантах забыли заескейпить " в данных.
var quotedClientDataKeyNames = from dataKeyName in clientDataKeyNames select "\"" + dataKeyName.Replace("\"", "\\\"") + "\"";
var dataKeyValues = "[" + string.Join(", ", quotedClientDataKeyNames) + "]";
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.