【问题标题】:States List: Foreach Loop状态列表:Foreach 循环
【发布时间】:2016-02-15 14:48:13
【问题描述】:

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

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

【问题讨论】:

  • 如果你想在每次调用函数时调用一种状态(不同的状态),则必须声明所涉及的变量(至少,当前状态的索引,即被修改)在函数之外。这是非常基本的,因此在这里偏离主题。
  • @varocarbas,为什么会被认为是题外话?只是出于好奇。
  • @DangerZone 这是我个人的观点,但我认为它离题了,因为它非常基础;比如问stringint 之间的区别或者函数是什么。解决方案(= 在正确的上下文中声明给定的变量,在这种情况下,在给定的函数之外)很简单,因此不会向其他任何人提供有价值的知识(对编程的了解最少);确定解决方案可能是什么(= 分析一个非常简单的算法并提出最合适的方法)也是调试的第 0 级...
  • @DangerZone ...另一方面,如果此问题/答案对您有帮助(或对您认识的任何人或您认为可能对其他人有帮助的人),您可能会考虑切题并采取相应行动(= 不要投票将其作为题外话搁置,以防您有足够的声誉,但似乎并非如此,也不要说它是题外话)。如果您处于这种情况,我建议您进行一些重度学习(不是在 C# 中,而是在一般编程/算法构建中),因为这绝对是太基础了。
  • 我明白你现在的意思了@varocarbas。我想这一切都取决于你的观点。我同意这有点太基本了。

标签: c# .net list foreach


【解决方案1】:

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

【讨论】:

  • 调用者如何确定它已到达列表末尾?
  • 我的实现没有尽头,不断重复,从头开始。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多