将列表转换为IEnumerable<SelectListItem>

42

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

列表

dynamicTextInDatabase 只是返回在我的数据库中使用的所有枚举。目前只返回 1 和 2。数据类只包含一个 int 值。

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

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

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

我需要通过 ViewBag 将 dynamicTextEnumsAvaiable 传递到我的视图中以在下拉列表中显示。但是,它必须是 IEnumerable<SelectListItem> 而不是 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();
6个回答

88

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

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

2
完美。我直接使用它,除了设置 Value 属性以外。我喜欢这些一行代码的 LAMBDA 技巧。 - jjthebig1
1
这是一个非常好的解决方案!!非常感谢!! - Geek

18

2
其他答案被选择了,难道不选择这个答案有什么原因吗? - Mark Schultheiss

15

你可以尝试使用 Linq 语句将其转换

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

没问题。我们的答案非常相似,所以至少可以完成! - Ric

1
如果你需要将一个对象列表(不包含枚举)转换为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; }
}

-1

你试过了吗?

IEnumerable<SelectListItem> myCollection = dynamicTextEnumsAvaiable.AsEnumerable()

不,这是我做的第一件事之一。 - Justin Adkins

-1

3
这是之前答案的副本,只增加了一个链接,另一个答案被提问者否定,称它对他们没有起作用。 - Mark Schultheiss

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