将IEnumerable<string>转换为IEnumerable<ListItem>

3
我尝试在C#中使用yield return功能时遇到了这个错误。该错误出现在Visual Studio中的select语句中,我真的不理解它。在我的想法中,我正在将字符串转换为ListItem,然后将所有内容作为IEnumerable返回。我的理解可能是错误的,关于yield return和IEnumerable的知识有所欠缺,因此需要帮助。注释掉的代码是旧方法,可以正常工作。

无法隐式转换类型 'System.Collections.Generic.IEnumerable' 到 'System.Web.UI.WebControls.ListItem'

public partial class CloseIncident : System.Web.UI.Page
{
    private ClevelandIncidentRepository repo = new ClevelandIncidentRepository();

    protected void Page_Load(object sender, EventArgs e)
    {
        SetDropDown(InitialType, repo.GetMainTypes());
    }

    private void SetDropDown(DropDownList dropDown, IEnumerable<string> items)
    {
        dropDown.Items.Clear();
        dropDown.Text = string.Empty;
        dropDown.Enabled = items.Count() > 0;

        dropDown.Items.AddRange(ToListItem(items).ToArray());
    }

    private IEnumerable<ListItem> ToListItem(IEnumerable<string> results)
    {
        yield return from result in results
                     select new ListItem(result);

        //List<ListItem> items = new List<ListItem>();

        //items.AddRange(from result in results
        //               select new ListItem(result));

        //return items;
    }
}

1
在我看来,“ToListItem”最好改名为“ToListItems”,因为它返回多个“ListItem”。 - AakashM
3个回答

5

您不需要使用yield return from ...,而是可以简单地使用return from ...或者:

private IEnumerable<ListItem> ToListItem(IEnumerable<string> results)
{
    return results.Select(s => new ListItem(s));
}

甚至可以摒弃此功能,并:
dropDown.Items.AddRange(items.Select(s => new ListItem(s)).ToArray());

啊,被验证码打败了。顺便问一下,我达到一定级别后,验证码会关闭吗? - Hawxby
哦,我真是太蠢了。我忘记了选择运算符将返回集合。因此,yield return 不喜欢集合。为自己辩护,这已经是漫长的一周了。感谢您指出这一点。 - Daniel Revell
@Beliskner,不,它不会被关闭。 - Darin Dimitrov

3
private IEnumerable<ListItem> ToListItem(IEnumerable<string> results)
    {
        return results.Select(x => new ListItem(x));
    }

1

yield return 应该指向一个单独的 ListItem,在 IEnumerable 迭代时以“惰性”的方式返回。您的 Linq 表达式是 IEnumerable 类型,因此存在不匹配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接