Преобразование IEnumberable в IEnumberable


Я получаю эту ошибку, которая при попытке использовать функцию возврата yield в C#. Ошибка появляется на select в visual studio, и я действительно не понимаю ее. В своем уме я преобразую строку в ListItem, а затем возвращаю лот как IEnumerable. Мое понимание отдачи и IEnumerable может быть очень далеко от цели, поэтому любая помощь будет оценена. Комментируемый код-это старый школьный способ его выполнения, который работает должным образом.

Не может неявно преобразовать тип - Система.Коллекции.Родовой.IEnumerable' к - Система.Сеть.ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС.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;
    }
}
3 3

3 ответа:

Вам не нужно 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());
private IEnumerable<ListItem> ToListItem(IEnumerable<string> results)
    {
        return results.Select(x => new ListItem(x));
    }

Yield return должен ссылаться на один ListItem, который будет возвращен "ленивым" способом при итерации IEnumerable. Ваше выражение linq имеет тип IEnumerable, поэтому существует несоответствие.