从For循环返回值

时间:2011-09-26 19:50:02

标签: c# winforms for-loop return

我的应用中有一个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而没有运气。

8 个答案:

答案 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;