Добавление нескольких элементов списка в другой в C # [дубликат]

Попробуйте использовать

int your_number = 20;
String url = "http://itunes.apple.com/us/rss/topsongs/limit=20/genre=29/explicit=true/json;"
url = url.replace("genre=29", "genre"+your_number);

и теперь используйте URL для запроса.

13
задан Michael0x2a 11 July 2016 в 18:34
поделиться

7 ответов

Вы можете свернуть собственный экземпляр ZipMany, который вручную выполняет итерацию каждого из перечислений. Вероятно, это будет лучше для больших последовательностей, чем те, которые используют GroupBy после проецирования каждой последовательности:

public static IEnumerable<TResult> ZipMany<TSource, TResult>(
    IEnumerable<IEnumerable<TSource>> source,
    Func<IEnumerable<TSource>, TResult> selector)
{
   // ToList is necessary to avoid deferred execution
   var enumerators = source.Select(seq => seq.GetEnumerator()).ToList();
   try
   {
     while (true)
     {
       foreach (var e in enumerators)
       {
           bool b = e.MoveNext();
           if (!b) yield break;
       }
       // Again, ToList (or ToArray) is necessary to avoid deferred execution
       yield return selector(enumerators.Select(e => e.Current).ToList());
     }
   }
   finally
   {
       foreach (var e in enumerators) 
         e.Dispose();
   }
}
17
ответ дан Eric Lippert 18 August 2018 в 01:30
поделиться
  • 1
    Это, должно быть, потребовалось для того, чтобы печатать на телефоне ... :) – Moo-Juice 31 July 2013 в 18:49
  • 2
    Я пошел и убрал его для тебя. Я считаю, что он отражает ваши намерения. – Jeff Mercado 31 July 2013 в 18:55
  • 3
    @JeffMercado Ты избил меня до буквально 5 секунд. У меня был почти такой же код (который я тестировал, и он работал). Я думаю, что это хорошая редакция. – Simon Belanger 31 July 2013 в 18:56
  • 4
    Огромное спасибо вам всем. – Eric Lippert 31 July 2013 в 19:09
  • 5
    @Oliver: Ах, теперь я понимаю суть вашего вопроса. Вы абсолютно правы; Я пренебрегал списком счетчиков. Я исправлю это. – Eric Lippert 24 January 2014 в 19:31

Взгляните на проект linqlib на codeplex , он имеет функцию поворота, которая делает именно то, что вам нужно.

2
ответ дан Amir Liberman 18 August 2018 в 01:30
поделиться

Вот неэффективный вариант, основанный на трансформации матрицы:

public static class Ext
{
    public static IEnumerable<IEnumerable<T>> Rotate<T>(
        this IEnumerable<IEnumerable<T>> src)
    {
        var matrix = src.Select(subset => subset.ToArray()).ToArray();
        var height = matrix.Length;
        var width = matrix.Max(arr => arr.Length);

        T[][] transpose = Enumerable
            .Range(0, width)
            .Select(_ => new T[height]).ToArray();
        for(int i=0; i<height; i++)
        {        
            for(int j=0; j<width; j++)
            {            
                transpose[j][i] = matrix[i][j];            
            }
        }

        return transpose;
    }
}
3
ответ дан JerKimball 18 August 2018 в 01:30
поделиться
  • 1
    +1, читаемый и метод расширения. – Moo-Juice 31 July 2013 в 18:49
  • 2
    @ Moo-Juice Не очень эффективен, хотя его можно улучшить. Многое происходит. :) – JerKimball 31 July 2013 в 18:51
  • 3
    +1 для упоминания его матрицы транспонирования – jk. 31 July 2013 в 22:17
(from count in Range(myList[0].Count)
select new List<string>(
    from count2 in Range(myList.Count)
    select myList[count2][count])
    ).ToList();

Это не очень, но я думаю, что это сработает.

0
ответ дан Nate Diamond 18 August 2018 в 01:30
поделиться
  • 1
    Я думаю, что это решение работает только в том случае, если внутри mylist есть три списка. Я надеялся больше на решение, которое работает независимо от количества списков. – Michael0x2a 31 July 2013 в 18:36
  • 2
    Хорошо, я думаю мое редактирование делает это. Не на 100% уверен, но основная идея есть. – Nate Diamond 31 July 2013 в 18:39

Вы можете конденсировать петли for, используя Диапазон :

var result = Enumerable.Range(0, myList.Min(l => l.Count))
    .Select(i => myList.Select(l => l[i]).ToList()).ToList();
1
ответ дан nmclean 18 August 2018 в 01:30
поделиться

Вы можете сделать это, используя расширение Select с помощью Func<T, int, TOut>:

var rotatedList = myList.Select(inner => inner.Select((s, i) => new {s, i}))
                        .SelectMany(a => a)
                        .GroupBy(a => a.i, a => a.s)
                        .Select(a => a.ToList()).ToList();

. Это даст вам еще один List<List<string>>.

Breakdown

.Select(inner => inner.Select((s, i) => new {s, i}))

Для каждого внутреннего списка мы проецируем содержимое списка на новый анонимный объект с двумя свойствами: s, строковое значение и i индекс этого значения в исходном списке.

.SelectMany(a => a)

Мы сглаживаем результат до одного списка

.GroupBy(a => a.i, a => a.s)

. Мы группируем по свойству i нашего анонимного объекта (напомним, что это индекс) и выберите s как наши значения (только строка).

.Select(a => a.ToList()).ToList();

Для каждой группы мы изменили перечисление на список и еще один список для всех групп.

12
ответ дан Simon Belanger 18 August 2018 в 01:30
поделиться
  • 1
    +1, но я могу быть в меньшинстве здесь, думая, что исходный метод OPs был way более читаемым. – Moo-Juice 31 July 2013 в 18:30
  • 2
    Я тоже в этой лодке, но все еще впечатлен – Jonesopolis 31 July 2013 в 18:31
  • 3
    @ Moo-Juice Я согласен. И это дает лучшую производительность. Я рассматриваю это как краевой регистр, в котором работает LINQ, но далеко не оптимальный. – Simon Belanger 31 July 2013 в 18:32
  • 4
    +1 отличный ответ. Даже если это только ради ответа, в отличие от эффективности, это хорошее решение. – keyboardP 31 July 2013 в 18:33
  • 5
    @SimonBelanger: Я пересмотрел свой комментарий, предполагая, что у вас есть отсортированный порядок ключей, они будут перегруппироваться в этом порядке. – user7116 31 July 2013 в 18:44

Как насчет использования SelectMany и GroupBy с некоторыми индексами?

// 1. Project inner lists to a single list (SelectMany)
// 2. Use "GroupBy" to aggregate the item's based on order in the lists
// 3. Strip away any ordering key in the final answer
var query = myList.SelectMany(
    xl => xl.Select((vv,ii) => new { Idx = ii, Value = vv }))
       .GroupBy(xx => xx.Idx)
       .OrderBy(gg => gg.Key)
       .Select(gg => gg.Select(xx => xx.Value));

Из LinqPad:

we groupa da items [/g0]

5
ответ дан user7116 18 August 2018 в 01:30
поделиться
  • 1
    +1. Это на самом деле больше соответствует сигнатуре метода, используемой в вопросе (IEnumerable<IEnumerable<T>>). – Simon Belanger 31 July 2013 в 18:39
Другие вопросы по тегам:

Похожие вопросы: