Объединение в цепочку IEnumerables в C#?

Как указано в комментариях Divakar, просто добавьте новую ось в b.

Я предлагаю вам больше узнать о вещании , что очень полезно для векторизации вычислений в numpy: интересно, a.transpose() - b не вызвало бы ошибку (вам понадобится

В этом вычислении форма первого массива - (3, 5), а b.shape - (5). Таким образом, форма b соответствует хвосту формы a, и может случиться вещание. Это не тот случай, когда форма первого массива (5, 3), следовательно, полученная вами ошибка.

Ниже приведены некоторые тесты времени выполнения для сравнения скоростей предлагаемых ответов с вашими значениями для a и b: вы можете видеть, что различия не очень значительны

In [9]: %timeit (a.T - b).T
Out[9]: 1000000 loops, best of 3: 1.32 µs per loop

In [10]: %timeit a - b[:,None]
Out[10]: 1000000 loops, best of 3: 1.25 µs per loop

In [11]: %timeit a - b[None].T
Out[11]: 1000000 loops, best of 3: 1.3 µs per loop

19
задан recursive 8 February 2009 в 18:19
поделиться

3 ответа

Попробуйте SelectMany.

IEnumerable<int> Collapse(IEnumerable<IEnumerable<int>> e){
 return e.SelectMany(x => x );
}

цель этой функции состоит в том, чтобы сгладить группу IEnumerable< IEnumerable< T> > в IEnumerable< T>. возвращенные данные сохранят первоначальный заказ.

24
ответ дан 30 November 2019 в 02:36
поделиться

В дополнение к (корректному) ответу JaredPar - также запрашивают синтаксис:

var all = from inner in outer
          from item in inner
          select item;
15
ответ дан 30 November 2019 в 02:36
поделиться

В дополнение к (корректным) основанным на LINQ ответам...

, Если Вы не хотите использовать LINQ, можно изобрести класс ChainedEnumerable, с помощью урожая:

public class ChainedEnumerable<T> : IEnumerable<T>
{
    private readonly IEnumerable<T>[] _inners;

    public ChainedEnumerable(params IEnumerable<T>[] inners)
    {
        _inners = inners;
    }

    public IEnumerator<T> GetEnumerator()
    {
        foreach (IEnumerable<T> inner in _inners)
        {
            foreach (T t in inner)
            {
                yield return t;
            }
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

Использование это как это:

List<string> a = new List<string> { "A1", "A2", "A3" };
List<string> b = new List<string> { "B1", "B2", "B3" };
ChainedEnumerable<string> chainedEnumerable =
    new ChainedEnumerable<string>(a, b);
foreach (string s in chainedEnumerable)
    Console.WriteLine(s);
12
ответ дан 30 November 2019 в 02:36
поделиться
Другие вопросы по тегам:

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