【问题标题】:Convert List to IEnumerable<SelectListItem>将列表转换为 IEnumerable<SelectListItem>
【发布时间】:2013-12-21 06:31:17
【问题描述】:

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

列表

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

dynamicTextEnumsInDatabase 与上面的列表相同,只是在实际存储我的枚举的类中。

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

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

我需要通过 ViewBag 将 dynamicTextEnumsAvaiable 传递给我的视图以显示在下拉列表中。但是,它必须是 IEnumerable&lt;SelectListItem&gt; 而不是 List

代码

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

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

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

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

        var 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();

【问题讨论】:

    标签: c# asp.net-mvc enums


    【解决方案1】:

    也许试试这个? (未经测试

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

    【讨论】:

    • 完美。除了设置 Value 属性外,我按原样使用它。我喜欢这些单行 LAMBDA hack。
    • 这么好的解决方案!!非常感谢!
    【解决方案2】:

    您可以执行以下操作

    ViewBag.AvaiableEnums = new SelectList(dynamicTextEnumsAvaiable)
    

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

    【讨论】:

    • 选择了其他答案,有理由不做这个吗?
    【解决方案3】:

    你也许可以使用 Linq 语句来转换它

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

    【讨论】:

    • 没问题。我们的答案非常相似,所以至少可以做到!
    【解决方案4】:

    如果您需要将对象列表(不带枚举)转换为 IEnumerable, 您可以使用 LINQ 的声明式风格:

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

    这里,tipoDocs 是一个 TipoDoc 类型的对象列表

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

    【讨论】:

      【解决方案5】:

      你试过了吗

      IEnumerable<SelectListItem> myCollection = dynamicTextEnumsAvaiable.AsEnumerable()
      

      【讨论】:

      • 不,这是我做的第一件事。
      【解决方案6】:

      只需使用 .AsEnumerable() 方法即可。

      例子:

      IEnumerable<SelectListItem> myCollection = dynamicTextEnumsAvaiable.AsEnumerable()
      

      在这里查看:https://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable(v=vs.110).aspx

      【讨论】:

      • 这是上一个答案的副本,仅添加了一个链接,另一个带有来自 OP 的负面评论,认为它对他们不起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多