foreach得到下一个项目

时间:2012-05-02 14:18:00

标签: c# loops foreach ienumerable enumerator

我有以下功能,但它很长,很脏,我想优化它:

        //some code
        if (use_option1 == true)
        {
            foreach (ListViewItem item in listView1)
            {
                //1. get subitems into a List<string>
                //
                //2. process the result using many lines of code
            }
        }
        else if (use_option2 = true)
        {
            //1. get a string from another List<string>
            //
            //2. process the result using many lines of code
        }
        else
        {
            //1. get a string from another List<string> (2)
            //
            //2. process the result using many lines of code
        }
这是非常好的,但它非常脏 我想用这样的东西:

        //some code
        if (use_option1 == true)
        {
            List<string> result = get_item();//get subitems into a List<string>
        }
        else if (use_option2 = true)
        {
            //get a string from another List<string>
        }
        else
        {
            //get a string from another List<string> (2)
        }


            //process the result using many lines of code


        private void get_item()
        {
            //foreach bla bla
        }

如何让get_item函数每次都获取列表中的下一项?

我读了一些关于GetEnumerator的内容,但我不知道这是否是我的问题的解决方案或如何使用它。

2 个答案:

答案 0 :(得分:1)

看一下yield keyword它是高效的并返回一个IEnumerable。请考虑以下示例:

        List<string> list = new List<string> { "A112", "A222", "B3243" };

        foreach(string s in GetItems(list))
        {
            Debug.WriteLine(s);
        }

如果您的GetItems方法定义如下:

public System.Collections.IEnumerable GetItems(List<string> lst)
{
    foreach (string s in lst)
    {
        //Some condition here to filter the list
        if (s.StartsWith("A"))
        {
            yield return s;
        }
    }
}

在你的情况下,你会有类似的东西:

public System.Collections.IEnumerable GetItems()
{
    for (ListViewItem in ListView)
    {
        //Get string from ListViewItem and specify a filtering condition
        string str = //Get string from ListViewItem
        //Filter condition . e.g. if(str = x)
        yield return str;
    }
}

如果你想进一步使用LINQ,那么它将归结为一行:

public System.Collections.IEnumerable GetItems(List<string> lst)
{
    return lst.Where(T => T.StartsWith("A"));
}

希望这很有用。

答案 1 :(得分:0)

您可以在官方文档中阅读此内容 - 例如:MSDN reference