将List转换为IEnumerable <selectlistitem> </selectlistitem>

时间:2013-12-04 16:41:25

标签: c# asp.net-mvc enums

这里有棘手的问题。我正在尝试将列表中的项目转换为IEnumerable<SelectListItem>

解释

dynamicTextInDatabase只返回我数据库中使用的所有枚举。目前只返回1和2.数据类simple保存一个int值。

dynamicTextEnumsInDatabase与实际存储我的枚举的类中的列表相同。

dynamicTextEnumsAll是我的应用程序中可用的所有枚举的列表。目前:1,2和3。

dynamicTextEnumsAvaiable是所有未使用的枚举的列表。它组合了所有枚举,然后删除数据库列表中的那些。

我需要通过ViewBag将dynamicTextEnumsAvaiable传递给我的View,以显示在下拉列表中。但是,它必须是IEnumerable<SelectListItem>而不是List

代码

        List<DynamicTextEnumData> dynamicTextInDatabase = new List<DynamicTextEnumData>();
        List<DynamicTextEnum> dynamicTextEnumsInDatabase = new List<DynamicTextEnum>();
        List<DynamicTextEnum> dynamicTextEnumsAll = new List<DynamicTextEnum>();
        IEnumerable<SelectListItem> list;

        using (var proxy = new Proxy<IDynamicText>())
        {
            dynamicTextInDatabase = proxy.Channel.DynamicTextGetActiveEnums(Helper.GetCallingUser());
        }

        foreach (DynamicTextEnumData item in dynamicTextInDatabase)
        {
            DynamicTextEnum dynamicTextEnum = (DynamicTextEnum)item.DynamicTextEnum;
            dynamicTextEnumsInDatabase.Add(dynamicTextEnum);
        }

        foreach (DynamicTextEnum item in Enum.GetValues(typeof(DynamicTextEnum)))
        {
            dynamicTextEnumsAll.Add(item);
        }

        List<DynamicTextEnum> dynamicTextEnumsAvaiable = dynamicTextEnumsAll.Except(dynamicTextEnumsInDatabase).ToList();

        if (dynamicTextEnumsAvaiable.Count == 0)
        {
            TempData["Error"] = "To update the text of a message or warning, please select it from the grid below.";
            return RedirectToAction("Index");
        }

        ViewBag.AvaiableEnums = dynamicTextEnumsAvaiable;
        return View();

6 个答案:

答案 0 :(得分:67)

也许试试这个? (未测试

ViewBag.AvaiableEnums = dynamicTextEnumsAvaiable.Select(x => 
                                  new SelectListItem() 
                                  {
                                      Text = x.ToString()
                                  });

答案 1 :(得分:12)

您可以执行以下操作

ViewBag.AvaiableEnums = new SelectList(dynamicTextEnumsAvaiable)

请参阅http://msdn.microsoft.com/en-us/library/system.web.mvc.selectlist(v=vs.118).aspx

答案 2 :(得分:11)

您可以使用Linq语句进行转换

IEnumerable<SelectListItem> myCollection = dynamicTextEnumsAvaiable
                                           .Select(i => new SelectListItem()
                                                        {
                                                            Text = i.ToString(), 
                                                            Value = i
                                                        });

答案 3 :(得分:0)

如果您需要将对象列表(无Enum)转换为IEnumerable 您可以使用LINQ的声明式样式:

var items = from TipoDoc t in tipoDocs
                select new SelectListItem {Value = t.Id, Text = t.Descripcion};

此处tipoDocs是TipoDoc类型的对象的列表

public class TipoDoc
{
    public string Id { get; set; }
    public string Descripcion { get; set; }
}

答案 4 :(得分:-1)

你试过吗

IEnumerable<SelectListItem> myCollection = dynamicTextEnumsAvaiable.AsEnumerable()

答案 5 :(得分:-1)

只需使用 .AsEnumerable()方法。

示例:

IEnumerable<SelectListItem> myCollection = dynamicTextEnumsAvaiable.AsEnumerable()

点击此处:https://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable(v=vs.110).aspx