0

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

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; }
}

索引.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 我想在我DropDownList仅有的 2 个项目中看到:DOC 和 PDF,而不是所有 10 个项目。

  2. DropDownList字母顺序排序

4

3 回答 3

1

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

List<MyObject> list = db.MyObjects.Where(x => x.family == "Web").ToList();
list= list.OrderBy(x => x.fileName).Distinct().ToList();
于 2013-11-10T15:02:08.847 回答
1

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

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();
于 2013-11-10T15:20:46.943 回答
0

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

于 2013-11-10T15:09:08.410 回答