C#列表中的唯一值

时间:2013-03-18 11:48:53

标签: c#-4.0 entity-framework-4

我正在使用MVC3和Entity框架。这次我想在列表中制作独特的项目。这是我的项目清单。

列表

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

在上面的列表中,我只想过滤以仅获取此列表,

1.Overdue
2.Itemsdue

另外,我需要将这个作为DropdownList,其中Overdue或Itemsdue作为Dropdown Text字段& 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");

请有人告诉我,我可以写下代码来实现我的逻辑。

由于

1 个答案:

答案 0 :(得分: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表达式结合起来。也许其他人会参与进来。