州名单:Foreach循环

时间:2015-11-13 22:11:05

标签: c# .net list foreach

我已经调整了一些生成随机状态值的代码(下面)

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循环是合适的,但我不确定如何最好地实现。

2 个答案:

答案 0 :(得分:2)

因为你要离开循环并且每次调用只选择一个状态我不会使用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];
    }
}

答案 1 :(得分:1)

您可以更改功能以返回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;
}