Преобразование IEnumerable‹string› в IEnumerable‹ListItem›

Я получаю эту ошибку при попытке использовать функцию возврата урожая в С#. Ошибка появляется при выборе внутри визуальной студии, и я действительно этого не понимаю. На мой взгляд, я преобразовываю строку в ListItem, а затем возвращаю лот как IEnumerable. Мое понимание доходности и 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;
    }
}

person Daniel Revell    schedule 19.01.2011    source источник
comment
На мой взгляд, ToListItem лучше было бы назвать ToListItems , так как он возвращает много ListItem s.   -  person AakashM    schedule 19.01.2011


Ответы (2)


Вам не нужно 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());
person Darin Dimitrov    schedule 19.01.2011
comment
Гах, битый по капче. Кстати говоря, это отключается, когда я поднимаюсь выше определенного уровня? - person Hawxby; 19.01.2011
comment
О боже, как идиотски с моей стороны. Я забыл, что оператор select все равно вернет коллекцию. Следовательно, доходность не нравится коллекции. В свою защиту это была долгая неделя. Спасибо что подметил это. - person Daniel Revell; 19.01.2011
comment
@Beliskner, нет, это не выключается. - person Darin Dimitrov; 19.01.2011

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

person babaandthepigman    schedule 19.01.2011