C # IEnumerable ‹Object› в строку

Для целей регистрации я хотел бы вызвать метод .ToString() для каждого объекта в массиве object []. Как я могу сделать это самым простым способом?

Скажем, у меня есть:

   myArray = new Object[]{"astring",1, Customer}

   Log(????);

Как передать строку, значение которой равно:

"astring".ToString()+1.ToString()+Customer.ToString()

Или лучше, с запятой между каждым значением.


person Toto    schedule 03.09.2009    source источник
comment
Dupe: stackoverflow.com/questions/380708/   -  person mmx    schedule 03.09.2009
comment
И действительно, stackoverflow.com/questions/145856   -  person Jon Skeet    schedule 03.09.2009


Ответы (4)


Нравится:

Log(String.Join(", ", myArray.Select(o => o.ToString()).ToArray()));

Обновлять:

Из фреймворка 4 метод Join также может принимать IEnumerable<string>, поэтому ToArray:

Log(String.Join(", ", myArray.Select(o => o.ToString())));
person Guffa    schedule 03.09.2009
comment
@ Джонатан: Верно. Я всегда так пишу, поэтому не знаю, почему я этого не сделал в этот раз ... - person Guffa; 03.09.2009
comment
Джонатан, что еще? Если вы должны были использовать String, почему C # вообще поставлялся с псевдонимами? - person Troels Thomsen; 03.09.2009
comment
@troethom: намерение кода становится более ясным, если вы используете строку псевдонима для типа и класс String при использовании статических методов в классе. - person Guffa; 03.09.2009
comment
Что яснее? Я искренне считаю, что не быть последовательным - плохая практика. - person Troels Thomsen; 03.09.2009
comment
@troethom: Ты правда не понимаешь, как это яснее? Если да, то как вы можете возражать против того, чего не понимаете? ;) - person Guffa; 03.09.2009
comment
Гуффа, я действительно не знаю, но я хотел бы знать, почему ты так думаешь. Если аргумент состоит в том, что строчная строка выглядит как переменная экземпляра, цвет ключевого слова должен указывать вам иное. Смешивание строки / строки подразумевает, что есть разница (которой нет). - person Troels Thomsen; 04.09.2009
comment
@troethom: Есть очень четкая разница, и разница в использовании. Вы можете использовать его как тип данных, чтобы указать ссылку на строку, и вы можете использовать его как имя класса для доступа к статическим членам класса. Ссылка для доступа к статическим членам не используется, так что это определенно два разных использования. Использование класса nade для статических членов делает эту разницу более очевидной. - person Guffa; 04.09.2009
comment
Кстати, я думаю, что string - это стандарт MS; это то, что обеспечивает StyleCop. - person satnhak; 05.11.2011
comment
@BTyler: в документации используется String: msdn.microsoft.com/en- us / library / 57a79xd0.aspx - person Guffa; 05.11.2011

MoreLINQ имеет _ 1_ именно для этой цели.

Он использует StringBuilder, а не String.Join (из того, что я помню из предыдущих вопросов, эффективность двух подходов сильно зависит от вводимых данных), но это достаточно просто. Вот основной код (есть пара оболочек, позволяющих использовать разделитель по умолчанию):

private static string ToDelimitedStringImpl<TSource>
    (IEnumerable<TSource> source, string delimiter)
{
    Debug.Assert(source != null);
    Debug.Assert(delimiter != null);

    var sb = new StringBuilder();

    foreach (var value in source)
    {
        if (sb.Length > 0) sb.Append(delimiter);
        sb.Append(value);
    }

    return sb.ToString();
}
person Jon Skeet    schedule 03.09.2009
comment
Нет необходимости проверять sb.Length на каждой итерации. Вы можете отказаться от 1-го разделителя, вернув sb.ToString (1, sb.Length-1). - person gimel; 03.09.2009
comment
@gimel: Учитывать длинные разделители и пустые источники немного сложнее. Но есть способы получше ... Я тоже не в восторге от отсутствия здесь подтяжек. Исправлю, когда у меня будет время :) - person Jon Skeet; 03.09.2009

Регулярно использую ...

String.Join(", ", Array.ConvertAll<object, string>(myArray, Convert.ToString))
person Richard    schedule 03.09.2009

Простой старомодный способ:

string myString = "";
foreach(Object o in myArray)
    myString += o.ToString() + ", ";
// Remove the extra comma
if(myString.Length >=2)
    myString.Remove(myString.Length - 2);
person Martin Delille    schedule 03.09.2009