目前,我正在尝试了解如何使用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
[您似乎想做的只是迭代序列,将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);
}