我有以下功能,但它很长,很脏,我想优化它:
//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的内容,但我不知道这是否是我的问题的解决方案或如何使用它。
答案 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