2013-03-18 78 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的表達方式。也許別人會加入。