在我的控制器中,我返回具有特定属性的对象列表:
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次更改但没有成功:
如果我有10个对象,则从我的DropDownList
中删除所有复制协议:9是doc协议,1 pdf i wand只在我的DropDownList
中看到2项:DOC和PDF而不是所有10个项目。
按字母顺序对此DropDownList
进行排序
答案 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