如何创建自定义的foreach循环?

问题描述 投票:0回答:1

目前,我正在尝试了解如何使用IEnumerable和IEnumerator接口。简而言之,我需要创建一个自定义的foreach循环,将每个“ 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

c# loops for-loop unity3d foreach
1个回答
2
投票

[您似乎想做的只是迭代序列,将1替换为0。在这种情况下,将其包装在产生收益率的方法中会更容易:

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);
}

您也可以使用Select方法使用Linq进行此操作:

foreach(var value in _nums.Select(v => v == 1 ? 0 : v))
{
  Console.WriteLine(value);
}
© www.soinside.com 2019 - 2024. All rights reserved.