Nano Hash - криптовалюты, майнинг, программирование

Объединение итераторов

Я реализовал класс, который объединяет несколько объектов IEnumerable в один объект IEnumerable, поэтому я могу написать:

foreach (SomeType item in new CombinedEnumerable<SomeType>(it1, it2))
{
   ...
}

Где it1 и it2 реализуют интерфейс IEnumerable‹ SomeType >. По эстетическим соображениям и для ясности кода я хотел бы написать:

foreach (SomeType item in it1 + it2)
{
   ...
}

Все, что мне нужно сделать, это реализовать этот оператор:

public static IEnumerable<T> operator +(IEnumerable<T> t1, IEnumerable<T> t2)
{
    return new CombinedEnumerable<T>(t1, t2);
}

Но компилятор не позволит мне это сделать, потому что определение должно быть внутри класса IEnumerable‹ T >. Есть ли обходной путь?

Изменить: возможный дубликат «Как объединить два IEnumerable в новый IEnumerable?» не решил проблему. Эту часть я уже решил. Я спросил, как реализовать оператор «+» (возможно, как метод расширения), что кажется невозможным.


  • У вас может быть тип it1 и it2, который перегружает оператор +, возвращая ваш класс CombinedEnumerable. Другой вариант — создать метод расширения, который создает класс CombinedEnumerable, тогда ваш синтаксис может быть foreach (SomeType item in it1.Plus(it2)) { .... Ваш метод расширения будет выглядеть примерно так: public static IEnumerable<T> Plus(this IEnumerable<T> current, IEnumerable<T> other) => new CombinedEnumerable<T>(current, other); 20.09.2018
  • Почему бы не использовать concat? это будет выглядеть как foreach(var item in it1.Concat(it2)))... 20.09.2018
  • Возможный дубликат Как объединить два IEnumerable‹T› в новый IEnumerable‹T›? 20.09.2018
  • Кто знает, что делает CombinedEnumerable @ZoharPeled! Может отличаться от Concat, Zip и т. д. 20.09.2018
  • @AleksAndreev - ОП не знает, как это сделать. Речь идет о перегрузке операции. 20.09.2018
  • @james Cockayne и Zohar Peled: CombinedEnumerable не создает новую общую коллекцию (без объединения), а выполняет итерацию по первой, а затем по второй коллекции, без нового распределения. it1, it2 могут быть любой универсальной коллекцией, поэтому мне придется вывести их все. 20.09.2018
  • @Gerhard, это то, что сделал бы Concat. Он не копирует коллекции, он просто сохраняет ссылку на них. Ознакомьтесь с исходным кодом, чтобы развлечься часами! Исходный код Concat 20.09.2018
  • @Джеймс. спасибо, я этого не знал. Это избавило бы меня от реализации CombinedEnumerable (чего было немного) 20.09.2018
  • @JamesCockayne Правильно, это было в основном обоснованное предположение, но, видимо, хорошее :-). Если бы я знал наверняка, я бы просто закрылся как дурак 20.09.2018
  • @Gerhard: для ясности кода; я сильно сомневаюсь, что это сделает ваш код более понятным, как раз наоборот. Каждый разработчик задался бы вопросом, что, черт возьми, там происходит. Они бы спросили себя, это дополнение, почему он может использовать его в foreach? 20.09.2018
  • Если вы определили два исходных типа коллекций, то добавьте оператор к одному или обоим, это единственный способ сделать это. Вы не можете добавлять операторы из-за пределов задействованных типов. 21.09.2018

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..