CSharp: Iterator Pattern in donet core 6
资源都来源于互联网
/// <summary>
/// 迭代器模式 Iterator Pattern
/// </summary>
public interface IIterableCollection
{
/// <summary>
///
/// </summary>
/// <returns></returns>
IIterator CreateIterator();
}
/// <summary>
/// 迭代器模式 Iterator Pattern
/// </summary>
public class FestivalCollection : IIterableCollection
{
/// <summary>
///
/// </summary>
private readonly List<MusicFestival> _festivals = new();
/// <summary>
///
/// </summary>
public int Count => _festivals.Count;
/// <summary>
///
/// </summary>
/// <param name="festival"></param>
public void Add(MusicFestival festival) => _festivals.Add(festival);
/// <summary>
///
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public MusicFestival Get(int index) => _festivals[index];
/// <summary>
///
/// </summary>
/// <returns></returns>
public IIterator CreateIterator() => new FestivalIterator(this);
}
/// <summary>
/// 迭代器模式 Iterator Pattern
/// </summary>
public interface IIterator
{
/// <summary>
///
/// </summary>
int Step { get; set; }
/// <summary>
///
/// </summary>
/// <returns></returns>
MusicFestival First();
/// <summary>
///
/// </summary>
/// <returns></returns>
MusicFestival Current();
/// <summary>
///
/// </summary>
/// <returns></returns>
bool MoveNext();
/// <summary>
///
/// </summary>
void Reset();
}
/// <summary>
/// 迭代器模式 Iterator Pattern
/// </summary>
public class FestivalIterator : IIterator
{
/// <summary>
/// /
/// </summary>
private readonly FestivalCollection _collection;
/// <summary>
///
/// </summary>
private int _position;
/// <summary>
/// /
/// </summary>
private int _step;
/// <summary>
///
/// </summary>
/// <param name="collection"></param>
public FestivalIterator(FestivalCollection collection)
{
_collection = collection;
_position = -1;
_step = 1;
}
// It's probably more logical to have a method for changing the step.
// However, for demo purposes the idea was to show that iterator interface can contain properties too.
/// <summary>
///
/// </summary>
public int Step
{
get => _step;
set
{
if (value <= 0)
{
throw new ArgumentOutOfRangeException(nameof(value), "步长只能是正值。当前迭代器不支持倒退.");
}
_step = value;
}
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public MusicFestival First()
{
_position = 0;
return Current();
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public MusicFestival Current() => _collection.Get(_position);
/// <summary>
///
/// </summary>
/// <returns></returns>
public bool MoveNext()
{
var updatedPosition = _position + _step;
if (updatedPosition < _collection.Count)
{
_position = updatedPosition;
return true;
}
return false;
}
/// <summary>
///
/// </summary>
public void Reset() => _position = -1;
}
/// <summary>
///
/// </summary>
public class MusicFestival
{
/// <summary>
/// 迭代器模式 Iterator Pattern
/// </summary>
/// <param name="name"></param>
/// <param name="country"></param>
public MusicFestival(string name, string country)
{
Name = name;
Country = country;
}
/// <summary>
///
/// </summary>
public string Name { get; set; }
/// <summary>
///
/// </summary>
public string Country { get; set; }
/// <summary>
///
/// </summary>
/// <returns></returns>
public override string ToString()
{
return $"姓名:{this.Name} 国家: {this.Country}";
}
}
/// <summary>
/// 迭代器模式 Iterator Pattern
/// </summary>
public static class MusicFestivalsExecutor
{
/// <summary>
/// 迭代器模式 Iterator Pattern
/// </summary>
public static void Execute()
{
ConsoleExtension.WriteSeparator(" 迭代器模式 Iterator Pattern:Music festivals demo");
var collection = new FestivalCollection();
collection.Add(new MusicFestival("春", "中国"));
collection.Add(new MusicFestival("四季之歌", "比利时"));
collection.Add(new MusicFestival("春", "英国"));
collection.Add(new MusicFestival("夏", "美国"));
collection.Add(new MusicFestival("冬", "中国"));
var iterator = collection.CreateIterator();
Console.WriteLine("初始遍历.");
Traverse(iterator);
iterator.Reset();
iterator.Step = 2;
Console.WriteLine("\nT应跳过所有其他元素的第二个遍历.");
Traverse(iterator);
}
/// <summary>
///
/// </summary>
/// <param name="iterator"></param>
private static void Traverse(IIterator iterator)
{
while (iterator.MoveNext())
{
var festival = iterator.Current();
Console.WriteLine($"音乐节 {festival.Name} 发生在{festival.Country}.");
}
}
}
调用:
Geovin.Du.DuIterator.MusicFestivals.MusicFestivalsExecutor.Execute();
输出:
迭代器模式 Iterator Pattern:Music festivals demo -------------------------------------------------- 初始遍历. 音乐节 春 发生在中国. 音乐节 四季之歌 发生在比利时. 音乐节 春 发生在英国. 音乐节 夏 发生在美国. 音乐节 冬 发生在中国. T应跳过所有其他元素的第二个遍历. 音乐节 四季之歌 发生在比利时. 音乐节 夏 发生在美国.
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
浙公网安备 33010602011771号