从我的DropDownList中删除重复项

时间:2013-11-10 14:57:37

标签: c# asp.net-mvc

在我的控制器中,我返回具有特定属性的对象列表:

public ActionResult Index()
{
    List<MyObject> list = db.MyObjects.Where(x => x.family == "Web").ToList();
    ViewBag.Files = new SelectList(list, "Id", "protocol");
    return View();
}

这是我的目标:

public class MyObject
{
    public int id { get; set; }
    public string fileName { get; set; }
    public string browser { get; set; }    
    public string protocol { get; set; }    
    public string family { get; set; }
}

Index.cshtml:

@Html.DropDownList("File", new SelectList(ViewBag.Files, "Id", "protocol_site"), "Select webmail site", new { style = "vertical-align:middle;" })

我尝试进行2次更改但没有成功:

  1. 如果我有10个对象,则从我的DropDownList中删除所有复制协议:9是doc协议,1 pdf i wand只在我的DropDownList中看到2项:DOC和PDF而不是所有10个项目。

  2. 按字母顺序对此DropDownList进行排序

3 个答案:

答案 0 :(得分:1)

您应该在代码中添加第二行。但是我不确定拼写是否正确,我没有使用VS.此外,如果Disctinct无法正常工作,您应该编写Comparer。

List<MyObject> list = db.MyObjects.Where(x => x.family == "Web").ToList();
list= list.OrderBy(x => x.fileName).Distinct().ToList();

答案 1 :(得分:1)

正如@Dreamcatcher在他的回答中提到的,你应该将已经准备好的集合传递给SelectList构造函数并使用linq来完成这些任务。对于Distinct linq方法,您需要创建自定义比较器,它将按协议字段比较对象:

public sealed class MyObjectByProtocolComparer: IEqualityComparer<MyObject>
{
    public bool Equals(MyObject x, MyObject y)
    {
        return x.protocol.Equals(y.protocol);
    }

    public int GetHashCode(MyObject obj)
    {
        return obj.protocol.GetHashCode();
    }
}

这是一个相当简单的实现,您可能需要检查空值。之后在你的linq查询中使用它:

var list = db.MyObjects.Where(x => x.family == "Web").ToArray();
list = list.Distinct(new MyObjectByProtocolComparer())
           .OrderBy(x => x.fileName)
           .ToArray();

答案 2 :(得分:0)

请遵循此页面http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx中的指导原则,以便您可以致电linq Distinct