Как создать собственный foreach l oop? - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь понять, как использовать интерфейсы IEnumerable и IEnumerator на данный момент. Короче говоря, мне нужно создать собственный foreach l oop, который заменит каждый элемент «1» на «0». Вот код, который по-прежнему не заменяет ни один элемент и по-прежнему выводит те же значения:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour, IEnumerator, IEnumerable
{
   private IEnumerator _enumerator;

   private readonly List<int> _nums = new List<int>{1, 2 ,4};
   private int _position = -1;

   public IEnumerator GetEnumerator()
   {
      return _nums.GetEnumerator();
   }

   public bool MoveNext()
   {
      if (_position < _nums.Count - 1)
      {
         _position++;
         return false;
      }
      return true;
   }

   public void Reset()
   {
      _position = -1;
   }

   public object Current
   {
      get {
         if (_nums[_position] == 1)
         {
            return 0; 
         }
         return _nums[_position];
      }
   }

   private void Start()
   {
      foreach (var i in _nums)
      {
         Debug.Log(_nums[i]);
      }
   }
}

Я буду признателен за любую помощь: P

1 Ответ

4 голосов
/ 17 июня 2020

Похоже, что вы пытаетесь просто перебрать последовательность, заменяя 1 на 0. В этом случае будет проще обернуть это в метод, который возвращает yield:

IEnumerable<int> GetValues(IEnumerale<int> source)
{
  foreach(var value in source)
  {
    if(value == 1)
    {
      yield return 0;
    }
    else
    {
      yield return value;
    }
  }
}

Теперь, если у вас есть:

List<int> _nums = new List<int>{1, 2 ,4};

Тогда вы можете сказать:

foreach(var value in GetValues(_nums))
{
  Console.WriteLine(value);
}

Вы также можете сделать это с помощью Linq, используя метод Select:

foreach(var value in _nums.Select(v => v == 1 ? 0 : v))
{
  Console.WriteLine(value);
}
...