国家列表:Foreach循环

问题描述:

我已经适应,其生成随机状态值(下面)国家列表: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循环是合适的,但我不确定如何最好地实现。

+0

如果您要拨打一个状态(不同的)每次调用函数的时候,你就必须申报所涉及的变量(至少当前状态的指标,已被修改的一个)功能之外。这是非常基本的,因此在这里非常重要。 – varocarbas

+0

@varocarbas,为什么会被认为是题外话?只是出于好奇。 –

+0

@DangerZone这是我个人的观点,但我认为它是非常基础的主题。比如询问'string'和'int'或者函数的区别。解决方案(=在正确的上下文中声明给定的变量,在这种情况下,在给定的函数之外)是直截了当的,因此不会为任何人提供有价值的知识(对编程的理解最少);确定什么样的解决方案可能是(=分析一个非常简单的算法,并想出最适当的方法)也是0级调试... – varocarbas

你可以改变返回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; 
} 

因为你离开环路,只选择一个国家每一个呼叫我不会用一个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]; 
    } 
} 
+0

呼叫者如何确定它已达到列表的末尾? – dotctor

+0

我的感触没有结束,它重复,从开始重新开始。 –