状态列表:Foreach循环

本文关键字:循环 Foreach 列表 状态 | 更新日期: 2023-09-27 18:21:48

我修改了一些生成随机状态值的代码(如下)

public static string GenRandomState()
{
    List<string> lst = new List<string>();
    randomState = string.Empty;
    lst.Add("Alabama");
    lst.Add("Alaska");
    lst.Add("Arizona");
    ...
    randomState = lst.OrderBy(xx => rnd.Next()).First();
    return randomState;
} // End GenRandomState

我想删除随机化,而是让该方法每次调用该方法时以相同的顺序(从上到下)调用状态。

所以,我希望看到的是:每次迭代,都会检索到一个状态值(从顶部开始)。将继续执行,直到调用完所有状态值为止。我认为Foreach循环是合适的,但我不确定如何最好地实现。

状态列表:Foreach循环

因为您要离开循环,每次调用只选择一个状态,所以我不会使用foreach循环,而是保留一个索引变量,并使用它来选择要使用的索引。

首先,我会将列表的创建转移到函数之外,这样只做一次。

public class StateInfo
{
    static StateInfo()
    {
        lst.Add("Alabama");
        lst.Add("Alaska");
        lst.Add("Arizona");
        ...
    }
    static readonly List<string> _lst = new List<string>();
    static readonly object _listLock = new object();
    static int _nextIndex = 0;
    public static string GetNextState()
    {
        int i = 0;
        lock(_listLock)
        {
            i = _nextIndex;
            _nextIndex = (_nextIndex + 1) % _lst.Count;                
        }
        return _lst[i];
    }
}

您可以更改函数以返回IEnumerable

static void Main(string[] args)
{
    foreach (var s in GetStates())
    {
        Console.WriteLine(s);
    }
}
public static IEnumerable<string> GetStates()
{
    var lst = new List<string>();
    lst.Add("Alabama");
    lst.Add("Alaska");
    lst.Add("Arizona");
    ...
    return lst;
}