国家列表: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循环是合适的,但我不确定如何最好地实现。
答
你可以改变返回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
我的感触没有结束,它重复,从开始重新开始。 –
如果您要拨打一个状态(不同的)每次调用函数的时候,你就必须申报所涉及的变量(至少当前状态的指标,已被修改的一个)功能之外。这是非常基本的,因此在这里非常重要。 – varocarbas
@varocarbas,为什么会被认为是题外话?只是出于好奇。 –
@DangerZone这是我个人的观点,但我认为它是非常基础的主题。比如询问'string'和'int'或者函数的区别。解决方案(=在正确的上下文中声明给定的变量,在这种情况下,在给定的函数之外)是直截了当的,因此不会为任何人提供有价值的知识(对编程的理解最少);确定什么样的解决方案可能是(=分析一个非常简单的算法,并想出最适当的方法)也是0级调试... – varocarbas