2

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

        //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 的东西,但我不知道这是否是我的问题的解决方案或如何使用它。

4

2 回答 2

1

看一下yield 关键字,效率很高,返回一个 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"));
}

希望这是有用的。

于 2012-05-04T18:50:05.857 回答
0

您可以在官方文档中阅读此内容 - 示例:MSDN 参考

于 2012-05-02T14:19:49.863 回答