2013-12-19 2 views
1

Я пытаюсь воспроизвести эту функцию в C#:Python (на C#) Метод преобразования

def sendData(self, eventCodes, data = None): 
    if data: 
     self.push('\x01'.join(map(str, [eventCodes] + data)) + "\x00") 
    else: 
     self.push(eventCodes + "\x00") 

Я считаю, что eventCodes является строкой и данных массив. Я не понимаю, как работает map(). Я думал, что он выполняет итерацию по всему массиву, выполняющему функцию для каждого элемента (в данном случае «str»). Однако я не вижу, как [eventCodes] + данные - это массив.

Я заинтересован в получении результата этой процедуры '\x01'.join(map(str, [eventCodes] + data)) + "\x00 "в C#

+1

'карты (FUNC, iterable) 'аналогичен C# 'iterable.Select (func)'. В python '[array] + [array] == [array, array]', который является просто конкатенацией списка. – Phoshi

+1

@Phoshi: используя слово 'array' для представления элемента в массиве, есть пустая строка – Eric

+1

@ Эрик: Правильно, я думаю, что я изменил направление с примером на полпути. Eugh. '[a] + [b] == [a, b]' намного лучше. – Phoshi

ответ

3

map(x, y) будет сродни этому C# код:

y.Select(item => x(item)) 

так это: map(str, [eventCodes] + data) будет сродни этому:

([eventCodes] + data).Select(item => str(item))` 
^-----------------^     ^-^ 

Выделенная часть s еще недействителен код C#. Что такое str, ну, наверное, мы можем заменить это ToString:

([eventCodes] + data).Select(item => item.ToString())` 
^-----------------^     

[eventCodes] + data присоединяет список, содержащий одну строку eventCodes с набором строк в data, так что мы имеем это:

new[] { eventCodes }.Concat(data).Select(item => item.ToString()) 

Перемещение из один шаг, это:

`\x01`.join(...) 

в C#:

string.Join("\x01", ...) 

так, то мы получим следующее:

string.Join("\x01", new[] { eventCodes }.Concat(data) 
    .Select(item => item.ToString())) 

Окончательный метод:

public void sendData(string eventCodes, IEnumerable<string> data = null) 
{ 
    if (data != null) 
     push(string.Join("\x01", new[] { eventCodes } 
      .Concat(data.Select(item => item.ToString()))) + "\x00"); 
    else 
     push(eventCodes + "\x00"); 
} 

Лично я хотел бы изменить код следующим образом:

public void sendData(string eventCodes, IEnumerable<string> data = null) 
{ 
    string element; 
    if (data != null) 
     element = string.Join("\x01", new[] { eventCodes } 
      .Concat(data.Select(item => item.ToString()))) 
    else 
     element = eventCodes; 
    push(element + "\x00"); 
} 
+0

'data', вероятно, не' IEnumerable ', поскольку код python должен был' str'ify его – Eric

+0

Вы, конечно, правы, позвольте мне исправить это. –

+0

@DominicKexel Не уверен, что я понимаю, что вы имеете в виду. «\ x01» добавит 1 вывод кодов к выходу со значением 1. Должен быть таким же, как в Python. –

Смежные вопросы