Zip-массив и смешанный массив в C # - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть два списка

, первый из которых List<String> propsNames может выглядеть следующим образом:

["Name", "Description", "HardwareID"]

, а другой список List<Object> propValues может выглядеть следующим образом.:

["USB Input Device", "USB Input Device", ["USB\\VID_062A&PID_4102&REV_8113", "USB\VID_062A&PID_4102"]]

Я хочу сжать список и распечатать его пара ключ-значение

var propNamesAndValues = propsNames.Zip(propValues, (pName, pValue) => new { propName = pName, propValue = pValue });   

 foreach (var item in propNamesAndValues)
 {
     sb.AppendLine(item.propName + ": " + item.propValue);                
 }

, это выведет меня (на sb.ToString();)

    Name: USB Input Device
    Description: USB Input Device
    HardwareID: System.String[]

но я хочу

Name: USB Input Device
Description: USB Input Device
HardwareID: USB\\VID_062A&PID_4102&REV_8113, USB\VID_062A&PID_4102

как мне этого добиться?

обратите внимание, что propValues может не содержать подмассив, и если это так, его местоположение может отличаться.

Редактировать : я не могу изменить и propValues набрать, потому что я получаю результат через отражение и не могу определить выход до времени выполнения

Ответы [ 2 ]

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

Вы должны проверить, является ли propValue строкой [], прежде чем использовать ее, а если это так, то вытянуть элементы оттуда.Так что-то вроде этого должно работать:

var propNamesAndValues = propsNames.Zip(propValues, (pName, pValue) => new { propName = pName, propValue = pValue });

var sb = new StringBuilder();

foreach (var item in propNamesAndValues)
{
    var sb2 = new StringBuilder();
    if (item.propValue.GetType() == typeof(string[]))
    {              
        foreach (var listItem in item.propValue as string[])
        {
            sb2.Append(listItem + ", ");
        }
    }
    else
    {
        sb2.Append(item.propValue);
    }

    sb.AppendLine(item.propName + ": " + sb2.ToString());
}
0 голосов
/ 14 февраля 2019

Вам нужно использовать string.Join.При переборе propValues проверьте, является ли элемент строкой.И если нет, вы можете привести его к IEnumerable

Попробуйте этот код:

var propsNames = new List<string> {"Name", "Description", "HardwareID"};
var propValues = new List<object> {"USB Input Device", "USB Input Device", new List<object> {"USB\\VID_062A&PID_4102&REV_8113", "USB\\VID_062A&PID_4102" }};

var propsAndValues = propsNames.Zip(propValues, (name, value) => new {name, value});
var sb = new StringBuilder();

foreach (var item in propsAndValues)
{
    var value = item.value is string 
      ? item.value 
      : string.Join(", ", (IEnumerable<object>)item.value);
    sb.AppendLine(item.name + ": " + value);
}

Обратите внимание, что этот код ожидает только вложенный массив 2 уровня.Если ваш propValues может выглядеть как

["1", "2", ["3", ["4", "5"]], "6"]

тогда нужно рекурсивно разобрать его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...