Member 14116966 Ответов: 3

Как мне научиться правильно разбивать один лайнер на соответствующие им отдельные шаги?


Эй,

поэтому в настоящее время я работаю над сайд-проектом, чтобы попасть в программирование и оказаться в точке, где мне часто приходится искать решения в интернете. Что, вообще говоря, не проблема, потому что я обычно могу учиться на этих вещах.

Однако на этот раз я нахожусь напротив однострочного решения, в котором много шагов загромождено в одном утверждении. Я уже пробовал разбить его на отдельные шаги, которые потребовались бы для этого-без особого успеха, потому что это очень трудно читать и обрабатывать, по крайней мере для меня.

Поэтому я задался вопросом, каков был бы идеальный способ сделать это?

return String.Join(".", (input.Split('.').Select(x => Convert.ToString(Int32.Parse(x), 2).PadLeft(8, '0'))).ToArray());


Это тот самый лайнер, о котором я говорю.

Что я уже пробовал:

Некоторое время я сам пытался его разрушить, но безуспешно.

PIEBALDconsult

Как вам будет угодно.

3 Ответов

Рейтинг:
27

OriginalGriff

Начните с того, что буквально разбейте его - используйте var чтобы отделить "биты" друг от друга, работайте слева и обрабатывайте скобки по мере их встречи:

var inJoin = (input.Split('.').Select(x => Convert.ToString(Int32.Parse(x), 2).PadLeft(8, '0'))).ToArray();
return String.Join(".", inJoin);
var beforeArray = input.Split('.').Select(x => Convert.ToString(Int32.Parse(x), 2).PadLeft(8, '0'));
var inJoin = beforeArray.ToArray();
return String.Join(".", inJoin);
var split = input.Split('.');
var beforeArray = split.Select(x => Convert.ToString(Int32.Parse(x), 2).PadLeft(8, '0'));
var inJoin = beforeArray.ToArray();
return String.Join(".", inJoin);
Затем вы можете использовать Intellisense для исправления типов:
string[] split = input.Split('.');
var beforeArray = split.Select(x => Convert.ToString(Int32.Parse(x), 2).PadLeft(8, '0'));
string[] inJoin = beforeArray.ToArray();
return String.Join(".", inJoin);

"Бит внутри Select" также довольно просто сломать:
private string BreakItDown(string x)
    {
    int intX = Int32.Parse(x);
    string converted = Convert.ToString(intX, 2);
    return converted.PadLeft(8, '0');

    }
private string myFunction(string input)
    {
    string[] split = input.Split('.');
    var beforeArray = split.Select(x => BreakItDown(x));
    string[] inJoin = beforeArray.ToArray();
    return String.Join(".", inJoin);
Итак, что же он делает? преобразование последовательности десятичных чисел, разделенных точками, в 8-значные двоичные числа, разделенные точками
Таким образом, "192.168.0.1" преобразуется в "11000000.10101000.00000000.00000001"

Но на самом деле это более читабельно, как одна строка ... :смеяться:


Maciej Los

5ed!

Рейтинг:
1

jaket-cp

решение 1 от OriginalGriff очень хорошо объясняет ситуацию
и решение 2 от Мацей Лос тоже очень хорошее
и не говоря уже о комментарии PIEBALDconsult "как вам угодно" - приятно :)

Но, возможно, чтобы помочь выяснить, как добраться до решения 1 и 2.

Одна из сложных частей, которую я полагаю, изучая данный язык, заключается в том, чтобы выяснить, какие из слов/битов принадлежат языку, а какие нет.

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

Чтобы упростить однострочный перевод, вы можете попробовать добавить возврат каретки и отступы, чтобы лучше визуализировать.

В случае C# разделите скобками запятую и точку.

//expanded one-liner - something like this
return String.Join(
    ".", 
    (
        input.Split('.')
            .Select( x => 
                Convert.ToString(
                    Int32.Parse(x),
                    2
                )
                .PadLeft(8,'0')
            )
    )
    .ToArray()
);

Выполняйте поиск с помощью языка программы однострочного типа-в данном случае C#
Давайте посмотрим, какие результаты поиска google мы можем получить сверху (если вы уже знаете, что они делают - нет необходимости искать):
возвращение с# оператор return - Справочник по C# | Microsoft Docs[^]
Строка c# Класс String (System) | Microsoft Docs[^]
Строка.Присоединяйтесь к C# или вступить с# Строка.Метод Соединения (Система) | Microsoft Docs[^]
вход.Split c# или Split c# Как это сделать: синтаксический анализ строк с помощью String.Split (Руководство По C#) | Microsoft Docs[^]
.Выберите( х =&ГТ; в# c# - возможная цель LINQ select( x => x ) - переполнение стека[^]
Преобразовать.Метод toString с# Преобразовать.Метод ToString (System) | Microsoft Docs[^]
Типа int32.Разбираем с# Int32.Метод Синтаксического Анализа (System) | Microsoft Docs[^]
PadLeft с# Строка.Метод Навесного Лева (Система) | Microsoft Docs[^]
ToArray() c# Список<T>.Метод ToArray (System.Коллекции.Общая) | Майкрософт Документы[^]

Добавьте комментарии к расширенному однострочному тексту - получение информации из поисковых запросов google.

return String.Join(//return a string of Concatenates the elements of a specified array or the members of a collection, using the specified separator between each element or member 
    ".", //using this separator
    (
        input.Split('.')//creates an array of substrings by splitting the input string based on one or more delimiters - using a separator as '.'
            .Select( x => //this is a tricky one - use linq select to parse the values somehow
                Convert.ToString(//Converts the specified value to its equivalent string representation
                    Int32.Parse(x),//Converts the string representation of a number to its 32-bit signed integer equivalent
                    2//Converts the value of a 32-bit signed integer to its equivalent string representation in a specified base
                )
                .PadLeft(8,'0')//returns a new string that right-aligns the characters in this instance by padding them on the left with a specified Unicode character, for a specified total length
            )
    )
    .ToArray()//An array containing copies of the elements of the List<T>
);

С этого момента - надеюсь, вы сможете выяснить, какие части можно разбить.
И расширьте до того, что вы могли бы получить в решении 1 и 2.


Вы, наверное, заметили, что я не выделил всех слов.:
- Строку.Присоединяйтесь
- вход.Расщеплять
- Преобразовать.Метод toString
- Типа int32.Разобрать
посмотрите, что вы получите от поиска их разделенных или нет


Рейтинг:
0

Maciej Los

В дополнение к решению №1 от OriginalGriff, я хотел бы объяснить вашу проблему немного по-другому. Прежде всего, вы должны понять, что делает такая длинная строка кода, чтобы иметь возможность разбить ее на более мелкие части.
Этот:

return String.Join(".", (input.Split('.').Select(x => Convert.ToString(Int32.Parse(x), 2).PadLeft(8, '0'))).ToArray());

на самом деле это означает: соединить строки из текста, разделенного точками и преобразованного в форму ноль-один.

Есть одна reduntant звоните: ToArray(), потому что string.Join() метод принимает IEnumerable(Of T) в качестве входных данных. Видеть: Строка.Метод Соединения (Система) | Microsoft Docs[^]

Как написать это строчка за строчкой? Простой. Видеть:
string input = "192.168.0.1";
//split input into parts
var result = input.Split('.');
//returns an array os strings:
//192 
//168 
//0 
//1 

//convert each part
var result1 = result.Select(x =>Convert.ToString(Int32.Parse(x), 2).PadLeft(8, '0'));
//returns an IEnumerable<string>
//11000000 
//10101000 
//00000000 
//00000001 

//join strings
var result2= string.Join(".", result1);
//returns a string
//11000000.10101000.00000000.00000001


Наконец, Примечание: C# чувствителен к регистру. Так, String это не то же самое, что string Объяснение вы найдете здесь: Строки - Руководство По Программированию На C# | Microsoft Docs[^]