我的应用中有一个listView。我遍历项目以检查当前选择的项目,然后返回一个值。由于所有路径都必须返回一个值,我必须返回一个覆盖for循环返回的循环外的值,如何在循环后不保留它而保留它?
public string GetItemValue()
{
for (int i = 0; i < listView1.Items.Count; i++)
{
if (listView1.Items[i].Checked == true)
{
return listView1.Items[i].Text; // I want to keep this value
}
}
// Without overwriting it with this but the compiler
// requires me to return a value here
return "Error";
}
非常感谢任何帮助。感谢。
P.S我试过在if之后使用break而没有运气。
答案 0 :(得分:9)
编辑:从上面删除我的评论。
您无需担心这一点。一旦它到达循环内的第一个return
,它将立即返回该值。在这种情况下,循环外没有代码。
顺便说一句,这段代码会更清晰:
public string GetItemValue()
{
foreach (var item in listView1.Items)
{
if (item.Checked) return item.Text;
}
throw new InvalidOperationException("No checked items found");
}
异常是一种处理错误的惯用方法,当您只是在集合上进行迭代时,foreach
循环优先于for
循环。
同样使用LINQ,您可以更加简洁:
public string GetItemValue()
{
return listView1.Items.Cast<ListViewItem>().Single(i => i.Checked).Text;
}
答案 1 :(得分:4)
好吧,你在循环之外返回return "Error";
不应该根据你的逻辑调用。由于return
会导致您的方法立即退出,因此“错误”返回将永远不会发生,除非代码永远不会进入循环内的if
。
考虑到所有因素,这可能是代码中的例外情况。因此,抛出异常可能是适当的事情:
public string GetItemValue()
{
for (int i = 0; i < listView1.Items.Count; i++)
{
if (listView1.Items[i].Checked == true)
{
return listView1.Items[i].Text; // I want to keep this value
}
}
throw new InvalidOperationException("Did not find value expected.");
}
通常会抛出异常以指示代码中存在错误。一个“嘿,应该真的不会发生。”应用程序停止,希望用户有机会联系支持人员以帮助您重现它。
基于your comment:
当我运行它时,它只返回错误文本...
这意味着您在if
声明中的签入没有成功。
if (listView1.Items[i].Checked == true)
这意味着您的ListView中的所有项目都不会被选中。
答案 2 :(得分:2)
在这种情况下,您可能更好地抛出异常以表明异常情况:
public string GetItemValue()
{
for (int i = 0; i < listView1.Items.Count; i++)
{
if (listView1.Items[i].Checked == true)
{
// Here you are leaving the GetItemValue method
// and the loop stops
return listView1.Items[i].Text;
}
}
// if we get that far it means that none of the items of
// the select list was actually checked => we are better of
// reporting this to the caller of the method
throw new Exception("Please select a value");
}
答案 3 :(得分:2)
for循环中的返回不会被覆盖 - 如果满足条件,该方法将返回循环中的值。在达到return
声明后立即执行该方法。
如果您的方法返回“Error”,那么我建议您在调试器中查看代码,因为它已到达循环的末尾并返回值“Error”。
答案 4 :(得分:2)
如果你在循环中返回一个值,它不应该达到循环之外的返回值。我会检查以确保循环找到所选项目。
另一个选项是创建一个局部变量来保存返回值:
string returnValue = "Error";
for (int i = 0; i < listView1.Items.Count; i++)
{
if (listView1.Items[i].Checked == true)
{
returnValue = listView1.Items[i].Text;
break;
}
}
return returnValue;
最后,您还可以考虑在未找到任何选择时返回异常,并从调用方法处理异常。
答案 5 :(得分:1)
return "Error"
位不会覆盖循环返回值。当命中return
时,该函数退出,因此当找到所选的值时,该函数将吐出您的数据并停止。
答案 6 :(得分:1)
编译器要求函数的所有路径都返回一个值。编译器无法事先知道您的内循环是否满足条件。您可以将值缓存在变量上,并在函数末尾返回该值,例如:
public string GetItemValue()
{
string temp = null;
for (int i = 0; i < listView1.Items.Count; i++)
{
if (listView1.Items[i].Checked == true)
{
temp = listView1.Items[i].Text; // I want to keep this value
break;
}
}
return temp; // Without overwriting it with this but the compiler requires me to return a value here
}
答案 7 :(得分:1)
实际上,这里不需要循环:
return (listView1.SelectedItems.Count > 0)
? listView1.SelectedItems[0].Text
: "Error";
但是,正如所说的那样,原始问题具有误导性,因为return
不会覆盖值。您可能正在考虑分配,而不是返回。在这种情况下,工作代码可能如下所示:
string ret = "Error";
foreach(var item in listView1.Items)
{
if(item.Checked) { ret = item.Text; break; }
}
return ret;