C# 来自For循环的返回值

C# 来自For循环的返回值,c#,winforms,for-loop,return,C#,Winforms,For Loop,Return,我的应用程序中有一个列表视图。我循环检查这些项目,以检查当前选择的项目,然后返回一个值。由于所有路径都必须返回一个值,因此我必须在循环外部返回一个值,该值将覆盖for循环返回,因此如何在循环之后保持该值而不覆盖它 public string GetItemValue() { for (int i = 0; i < listView1.Items.Count; i++) { if (listView1.Items[i].Checked == true)

我的应用程序中有一个列表视图。我循环检查这些项目,以检查当前选择的项目,然后返回一个值。由于所有路径都必须返回一个值,因此我必须在循环外部返回一个值,该值将覆盖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"; 
}
非常感谢您的帮助。谢谢


另外,我尝试在if之后使用break,但没有成功。

返回错误位不会覆盖循环返回值。当返回被点击时,函数退出,因此当找到所选的值时,函数将吐出您的数据并停止。

返回错误位不会覆盖您的循环返回值。当返回被点击时,函数退出,因此当找到所选的值时,函数将吐出您的数据并停止。

在这种情况下,您最好抛出异常以发出异常情况的信号:

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");
}

在这种情况下,您可能会更好地抛出异常来表示异常情况:

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");
}

for循环中的返回不会被覆盖-如果满足条件,该方法将在循环中返回值。到达return语句后,方法的执行立即结束


如果您的方法返回错误,那么我建议您在调试器中查看代码,因为它将到达循环的末尾并返回值错误。

for循环中的返回不会被覆盖-如果您的条件满足,该方法将返回循环中的值。到达return语句后,方法的执行立即结束


如果您的方法返回错误,那么我建议您在调试器中查看代码,因为它正在到达循环的末尾并返回值错误。

那么,您的返回在循环之外,返回错误;根据你的逻辑不应该被打电话。因为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.");
        }

这意味着ListView中的所有项目都未被检查。

好吧,您的返回超出了循环,返回错误;根据你的逻辑不应该被打电话。因为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.");
        }

这意味着没有检查ListView中的任何项。

编译器要求函数的所有路径都返回一个值。编译器无法事先知道是否满足内部循环if条件。您可以在变量处缓存该值,并在函数末尾返回该值,例如:

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
    }

编译器要求函数的所有路径都返回一个值。编译器无法事先知道是否满足内部循环if条件。您可以在变量处缓存该值,并在函数末尾返回该值,例如:

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
    }
编辑:从上面下载我的评论


你不必为此担心。一旦它到达循环中的第一个返回,它将立即返回该值。在这种情况下,不会命中循环外的任何代码

顺便说一句,此代码会更干净:

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;
}
编辑:从上面下载我的评论


你不必为此担心。一旦它到达循环中的第一个返回,它将立即返回该值。在这种情况下,不会命中循环外的任何代码

顺便说一句,此代码会更干净:

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;
}

如果您在循环中返回一个值,它不应该到达循环外的返回值。我将检查以确保循环正在查找所选项目

另一个选项是创建一个局部变量来保存返回值:

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;

最后,您也可以考虑在没有选择的情况下返回异常,并从调用方法处理异常。

< P>如果您在循环中返回一个值,则它不应该达到循环外的返回值。我将检查以确保循环正在查找所选项目

另一个选项是创建一个局部变量来保存返回值:

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;
最后,你也可以考虑
r在未找到任何选择时返回异常,并从调用方法处理异常。

实际上,这里不需要循环:

return (listView1.SelectedItems.Count > 0)
    ? listView1.SelectedItems[0].Text
    : "Error";
但是,正如所说的,最初的问题是误导性的,因为返回值并不覆盖值。你可能在考虑任务,而不是返回。在这种情况下,工作代码可以如下所示:

string ret = "Error";
foreach(var item in listView1.Items)
{
    if(item.Checked) { ret = item.Text; break; }
}

return ret;

实际上,这里不需要循环:

return (listView1.SelectedItems.Count > 0)
    ? listView1.SelectedItems[0].Text
    : "Error";
但是,正如所说的,最初的问题是误导性的,因为返回值并不覆盖值。你可能在考虑任务,而不是返回。在这种情况下,工作代码可以如下所示:

string ret = "Error";
foreach(var item in listView1.Items)
{
    if(item.Checked) { ret = item.Text; break; }
}

return ret;

你不必为此担心。一旦它到达循环中的第一个返回,它将立即返回该值。在这种情况下,不会命中循环外的任何代码。您是否尝试过它以查看真正发生的情况?当我运行它时,它只返回错误文本…@Bali C您检查过项目吗?打断它以确保if语句的执行。@BaliC如果它返回错误文本,则循环中的if条件永远不会通过。您不必担心这一点。一旦它到达循环中的第一个返回,它将立即返回该值。在这种情况下,不会命中循环外的任何代码。您是否尝试过它以查看真正发生的情况?当我运行它时,它只返回错误文本…@Bali C您检查过项目吗?打断它以确保if语句的执行。@BaliC如果它返回错误文本,则循环中的if条件永远不会通过。这是错误的。编译器将拒绝此操作,原因与原始代码相同–temp变量未被明确指定值。这是错误的。编译器将拒绝此操作,原因与原始代码相同–temp变量未被明确指定值。请将新异常更改为更具体的类型,并在第二个示例中添加强制转换,这样就完美了-好的观点。我忘记了Windows窗体对象返回非通用容器。令人遗憾的是,所有这些老部件仍然保留着它们的特性!将新异常更改为更具体的类型,并在第二个示例中添加强制转换,这样就完美了-好的观点。我忘记了Windows窗体对象返回非通用容器。令人遗憾的是,所有这些老部件仍然保留着它们的特性!