Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / List в строку, с разделением запятыми. Как ? / 20 сообщений из 20, страница 1 из 1
08.12.2014, 15:52
    #38828178
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
Привет.

Нужно склеить все элементы List<string> в одну строку, разделив запятыми.
Есть ли для этого стандартный метод ?
...
Рейтинг: 0 / 0
08.12.2014, 15:54
    #38828180
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
Join() есть у Array
...
Рейтинг: 0 / 0
08.12.2014, 16:04
    #38828190
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
Код: c#
1.
string.Join(string separator, IEnumerable<string> values)
...
Рейтинг: 0 / 0
08.12.2014, 16:06
    #38828194
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
Konst_One,
У меня List. Не хочется делать лишнее преобразование к массиву.

Shocker.Pro,

Спасибо !!
...
Рейтинг: 0 / 0
08.12.2014, 20:56
    #38828418
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
ProBiotekУ меня List. Не хочется делать лишнее преобразование к массив
http://codearticles.ru/articles/912
...
Рейтинг: 0 / 0
09.12.2014, 10:40
    #38828675
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
Самый быстрый способ. Нет кучи копирований в памяти, как в случае со StringBuilder.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var tmp = Enumerable.Range(0, 10000).Select(_ => Guid.NewGuid().ToString()).ToList();
            var count1 = tmp.Count;
            var count2 = tmp.Select(x => x.Length).Sum();
            var ch = new char[count2 + count1];
            int counter = 0;
            foreach (var x1 in tmp)
            {
                foreach (var x2 in x1)
                {
                    ch[counter++] = x2;
                }
                ch[counter++] = ',';
            }
            var str = new string(ch);
...
Рейтинг: 0 / 0
09.12.2014, 10:43
    #38828679
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
ЕвгенийВСамый быстрый способ. Нет кучи копирований в памяти, как в случае со StringBuilder.В StringBuilder можно задать начальный размер, тогда кучи копирований не будет.
...
Рейтинг: 0 / 0
09.12.2014, 10:44
    #38828680
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
ЕвгенийВСамый быстрый способ. Нет кучи копирований в памяти, как в случае со StringBuilder.

String.Join и String.Concat работают достаточно эффективно, не нужны эти кривые поделки со стрингбилдером, и уж тем более вот таких извратов.

Когда потребуется экстремальная эффективность, придётся делать unsafe, а все эти ваши велосипеды при любых раскладах -- на помойку.
...
Рейтинг: 0 / 0
09.12.2014, 10:44
    #38828681
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
Алексей КВ StringBuilder можно задать начальный размер, тогда кучи копирований не будет.

Не нужен он в данном случае.
...
Рейтинг: 0 / 0
09.12.2014, 10:47
    #38828686
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
hVosttАлексей КВ StringBuilder можно задать начальный размер, тогда кучи копирований не будет.

Не нужен он в данном случае.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
    /// <summary>
    /// Concatenates the members of a constructed <see cref="T:System.Collections.Generic.IEnumerable`1"/> collection of type <see cref="T:System.String"/>, using the specified separator between each member.
    /// </summary>
    /// 
    /// <returns>
    /// A string that consists of the members of <paramref name="values"/> delimited by the <paramref name="separator"/> string. If <paramref name="values"/> has no members, the method returns <see cref="F:System.String.Empty"/>.
    /// </returns>
    /// <param name="separator">The string to use as a separator.</param><param name="values">A collection that contains the strings to concatenate.</param><exception cref="T:System.ArgumentNullException"><paramref name="values"/> is null. </exception>
    [ComVisible(false)]
    [__DynamicallyInvokable]
    public static string Join(string separator, IEnumerable<string> values)
    {
      if (values == null)
        throw new ArgumentNullException("values");
      if (separator == null)
        separator = string.Empty;
      using (IEnumerator<string> enumerator = values.GetEnumerator())
      {
        if (!enumerator.MoveNext())
          return string.Empty;
        StringBuilder sb = StringBuilderCache.Acquire(16);
        if (enumerator.Current != null)
          sb.Append(enumerator.Current);
        while (enumerator.MoveNext())
        {
          sb.Append(separator);
          if (enumerator.Current != null)
            sb.Append(enumerator.Current);
        }
        return StringBuilderCache.GetStringAndRelease(sb);
      }
    }
...
Рейтинг: 0 / 0
09.12.2014, 11:05
    #38828701
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
Алексей К,

и ведь не поленился же

BrokenGlass
You should use string.Join() because:

a) it's much more readable, maintainable and easy on the eyes.

b) it uses a StringBuilder internally already, so it's very efficient ( you can confirm yourself using Reflector).

String.Join() uses a StringBuilder for the general case of an IEnumerable<T> input. If you already have an array on the other hand it uses some voodoo magic (including FastAllocateString() and UnSafeCharBuffer) to be even faster.
...
Рейтинг: 0 / 0
09.12.2014, 11:19
    #38828714
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
hVosttне поленился в тему...
...
Рейтинг: 0 / 0
09.12.2014, 11:28
    #38828723
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
hVosttАлексей К,

и ведь не поленился же Да. :-)
...
Рейтинг: 0 / 0
09.12.2014, 14:13
    #38828975
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
hVostt
Когда потребуется экстремальная эффективность, придётся делать unsafe, а все эти ваши велосипеды при любых раскладах -- на помойку.
Это не велосипеды, это исследования.
Насчет unsafe согласен + несколько потоков.
...
Рейтинг: 0 / 0
09.12.2014, 14:37
    #38829027
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
ЕвгенийВЭто не велосипеды, это исследования.
Насчет unsafe согласен + несколько потоков.

попахивает преждевременной оптимизацией. чем бы дитя не тешилось, лишь бы не занималось делом.
...
Рейтинг: 0 / 0
09.12.2014, 17:55
    #38829375
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
hVostt
попахивает преждевременной оптимизацией. чем бы дитя не тешилось, лишь бы не занималось делом.
String.Join проигрывает параллельной реализации чуть меньше чем в 3 раза.

P. S. алгоритм хорошо распараллеливается, попробовал из спортивного интереса.
...
Рейтинг: 0 / 0
09.12.2014, 18:26
    #38829430
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
ЕвгенийВhVosttпопахивает преждевременной оптимизацией. чем бы дитя не тешилось, лишь бы не занималось делом.
String.Join проигрывает параллельной реализации чуть меньше чем в 3 раза.

P. S. алгоритм хорошо распараллеливается, попробовал из спортивного интереса.
Да ну? Если вы пробовали, приведите код, я тоже хочу посмотреть. Имею ввиду реализацию с потоками.
...
Рейтинг: 0 / 0
09.12.2014, 18:35
    #38829443
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
Arm79,
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
      static void Main(string[] args)
        {
            Stopwatch sw = new Stopwatch();
            Random r = new Random();
            var data = Enumerable.Range(0, 100000).Select(_ => new string((char)r.Next(60, 100), r.Next(100, 1000))).ToList();
            sw.Restart();
            char[] chars = new char[data.Count + data.Select(x => x.Length).Sum()];
            List<Task> tList = new List<Task>();
            int begin = 0;
            
            foreach (var d in data)
            {
                int tmp = begin;
                var d1 = d;
                tList.Add(Task.Factory.StartNew(() => M1(chars, d1, tmp)));
                begin += d.Length + 1;
            }
            Task.WaitAll(tList.ToArray());
            var str = new string(chars);
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);
            sw.Start();
            str = string.Join(",", data);
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);
            Console.ReadLine();
        }
        static void M1(char[] chars, string st, int begin)
        {
            int i;
            for (i = begin; i < begin + st.Length; i++)
            {
                chars[i] = st[i - begin];
            }
            chars[i] = ',';
        }
...
Рейтинг: 0 / 0
10.12.2014, 17:58
    #38830553
List в строку, с разделением запятыми. Как ?
ЕвгенийВString.Join проигрывает параллельной реализации чуть меньше чем в 3 раза.

P. S. алгоритм хорошо распараллеливается, попробовал из спортивного интереса.

Это смотря на какой машинке. Вот на Core2Duo E6500 (2.4GHz) разница составила немногим меньше чем в 2 раза
А вот на Core i7 2600K (3.4Ghz) разница совсем незначительная ~1.2 раза (887 против 1098).
А вот вы на какой машинке тестировали?
...
Рейтинг: 0 / 0
11.12.2014, 14:59
    #38831459
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
List в строку, с разделением запятыми. Как ?
Артемий Соболев,
core i5-3570K (3.4 GHz)
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / List в строку, с разделением запятыми. Как ? / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]