2013-03-18 52 views
0

我在实体框架中使用了MVC3。这次我想在列表中制作独特的项目。这是我的物品清单。C#列表中的唯一值

列表

1.Overdue-1 
2.Overdue-M 
3.ItemsDue-1 
4.ItemsDue-5 

在以上列表中,我只是想过滤得到的只有这个名单,

1.Overdue 
2.Itemsdue 

而且,我需要这一个作为下拉列表,其中逾期送达的或者Itemsdue作为下拉文本字段& 1到n作为值字段。我试过这个。但我可以为Dropdown和Unique列表执行逻辑。

代码

var select = (from asd in db.Sys 
         select new EmailTemp 
         { 
          SysCode = asd.Code, 
          SysmailId = asd.Id 
         }).Distinct().ToList(); 
     List<EmailTemp> filterlist = new List<EmailTemp>(); 
     foreach (var a in select) 
     { 
      string lates = a.SysCode; 
      var ind = lates.IndexOf("-"); 
      if (ind > 0) 
      { 
       a.SysCode = lates.Substring(0, ind); 
       a.SysmailId = a.SysmailId; 
       filterlist.Add(a); 
      } 
      else 
      { 
       a.SysCode = lates; 
       a.SysmailId = a.SysmailId; 
       filterlist.Add(a); 
      } 
     } 
     //var idlist = filterlist.Distinct().ToList(); 
     ViewBag.SysMailType = new SelectList(filterlist.Distinct().ToList(), "SysmailId", "SysCode"); 

请任何人告诉我,我可以写下来的代码来实现我的逻辑的可能性。

感谢

回答

0

您可以创建自定义equality comparer并用它来比较使用Distinct的项目。

class MyEqualityComparer: EqualityComparer<EmailTemp> 
{ 
    private string GetPrefix(string s) 
    { 
     var pos = sIndexOf("-"); 
     var rslt = (pos > 0) ? s.SubString(0, pos) : s; 
     return rslt; 
    } 

    public override bool Equals(EmailTemp t1, EmailTemp t2) 
    { 
     var s1 = GetPrefix(t1.SysCode); 
     var s2 = GetPrefix(t2.SysCode); 
     return s1.Equals(s2); 
    } 

    public override int GetHashCode(EmailTemp t1) 
    { 
     return GetPrefix(t1.SysCode).GetHashCode(); 
    } 
} 

而且,产生的独特的物品清单:

List<EmailTemp> filterList = select.Distinct(new MyEqualityComparer()).ToList(); 

有可能是结合起来,与你的第一个LINQ的表达方式。也许别人会加入。