Оптимизированный код (как в ruby) для замены цифр в нечетных местах на 2 числа в C # - PullRequest
0 голосов
/ 26 февраля 2019

Я разработчик ruby ​​и в некоторых случаях мне нужно поменять местами цифры в нечетных местах в 2 числах в C#.

Я кодировал в ruby ​​основным способом, как показано ниже,

a = 35321
b = 123456
a1, b1 = a.to_s.chars, b.to_s.chars # ['3', '5', '3'. '2', '1'], ['1', '2', '3', '4', '5', '6'] 

n = [a1.length, b1.length].min - 1 # => 4

поменял местами ниже,

n.times do |i|
  if i.odd?
    temp = a1[i]
    a1[i] = b1[i]
    b1[i] = a1[i]
  end
end  

Или ниже оптимизированный код с использованием метода stepв рубине,

1.step(n,2) { |i| a1[i], b1[i] = b1[i], a1[i] }

И в конце я получаю числа в соответствии с ожиданием, как,

> a = a1.join.to_i
# => 32341 
> b = b1.join.to_i
# => 153256

Моя проблема в том, что я не могу понять, как я могу сделать то же самое в C#Ценится, если кто-либо предоставит любое предложение.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

В c# есть множество способов получить желаемый результат, но я даю вам решение, которое вы легко поймете,

Прежде всего мы объявим ваш целочисленный массив в c# как

int input1 = 35321;
int input2 = 123456;

int[] a = input1.ToString().Select(t => int.Parse(t.ToString())).ToArray();
int[] b = input2.ToString().Select(t => int.Parse(t.ToString())).ToArray();

Затем мы используем традиционный цикл for, чтобы поменять число между двумя массивами с нечетным индексом

for (int i = 0; i < a.Length; i++)    //<= Loop through on first array
{
     if (i % 2 != 0)                  //<= Check for odd index
     {
          int q = a[i];               //<= Take element from first array with current index
          a[i] = b[i];                //<= Swap element from second array to first array on current index
          b[i] = q;                   //<= Swap element from first array to second array on current index
     }
}

Затем мы просто распечатаем желаемый результат с помощью

int number1 = Convert.ToInt32(string.Join("", a));
int number2 = Convert.ToInt32(string.Join("", b));

Console.WriteLine("Output for first array: \t" + number1);
Console.WriteLine("Output for second array: \t" + number2);

Выход:

enter image description here

Демо

0 голосов
/ 26 февраля 2019

Учитывая, что входы a и b будут строками.Приведенный ниже код должен дать вам желаемый результат.

var result = string.Join("", b.ToString().Select((x, i) => (i % 2) == 0 || a.ToString().Length <= i ? x.ToString() : a.ToString().Substring(i, 1)));

этот код будет учитывать разницу в длине.

Редактировать :Вы также можете реализовать использование LINQ, избегая циклов и рассматривая a и b как числа, как показано ниже.

int[] ai = a.ToString().Select(x => int.Parse(x.ToString())).ToArray();
int[] bi = b.ToString().Select(x => int.Parse(x.ToString())).ToArray();

var number1 = string.Join("", bi.Select((x, i) => (i % 2) == 0 || ai.Count() <= i ? x.ToString() : ai[i].ToString()));
var number2 = string.Join("", ai.Select((x, i) => (i % 2) == 0 || bi.Count() <= i ? x.ToString() : bi[i].ToString()));

Console.WriteLine("Array 1:" + Convert.ToInt32(number1));
Console.WriteLine("Array 2:" + Convert.ToInt32(number2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...