0

我正在使用带有实体框架的 MVC3。这次我想在列表中制作独特的项目。这是我的物品清单。

列表

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

在上面的列表中,我只是想过滤得到这个列表,

1.Overdue
2.Itemsdue

另外,我需要将此设置为 DropdownList ,其中 Overdue 或 Itemsdue 作为下拉文本字段和 1 到 n 作为值字段。我试过这个。但我可以为下拉列表和唯一列表做逻辑。

代码

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");

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

谢谢

4

1 回答 1

0

您可以创建一个自定义相等比较器并使用它来比较使用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 表达式结合起来。也许其他人会插话。

于 2013-03-18T13:26:10.513 回答