无法使用SelectListitem获取不同的值

时间:2015-05-01 14:22:26

标签: c# linq

我试图为下拉列表获取不同的值,但是当使用以下语法时,它会将我带回所有行。

有人可以告诉我如何使用正确的语法设置不同的值吗?

IEnumerable<SelectListItem> ldidList = _db.TrafficHits.Select(c => new SelectListItem
            {
                Value = c.Id.ToString(),
                Text = c.ldid
            }).Distinct();

4 个答案:

答案 0 :(得分:9)

您当前代码的问题是Distinct将使用SelectListItem的默认比较器。您需要提供如下自定义比较器: -

public class SelectListItemComparer : IEqualityComparer<SelectListItem>
    {
        public bool Equals(SelectListItem x, SelectListItem y)
        {
            return x.Text == y.Text && x.Value == y.Value;
        }

        public int GetHashCode(SelectListItem  item)
        {
            int hashText = item.Text == null ? 0 : item.Text.GetHashCode();
            int hashValue = item.Value == null ? 0 : item.Value.GetHashCode();
            return hashText ^ hashValue;
        }
    }

然后你就可以这样使用它: -

IEnumerable<SelectListItem> ldidList = _db.TrafficHits.Select(c => new SelectListItem
            {
                Value = c.Id.ToString(),
                Text = c.ldid
            }).Distinct(new SelectListItemComparer());

答案 1 :(得分:4)

您可以使用group by,然后为每个组选择第一个元素:

IEnumerable<SelectListItem> ldidList = _db.TrafficHits
                                          .GroupBy(t => t.Id)
                                          .Select(g => g.First())
                                          .Select(c => new SelectListItem
                                          {
                                             Value = c.Id.ToString(),
                                             Text = c.ldid
                                         });

答案 2 :(得分:1)

我非常确定SelectListItem没有值相等(即它不会覆盖Equals)。每个项目都等同于引用,因此即使它们具有相同的值,您的所有项目都不会相等。

假设你的命中率为&#39; Id是唯一的,请尝试:

var items = _db.TrafficHits
    .GroupBy(h => h.Id)
    .Select(g => new SelectListItem
    {
        Value = g.Key.ToString(),
        Text = g.First().ldid
    });

答案 3 :(得分:0)

另一个选择是使用MoreLinq Nuget软件包。

它具有DistinctBy方法

您可以按以下方式使用它

_db.TrafficHits.Select(c => new SelectListItem
            {
                Value = c.Id.ToString(),
                Text = c.ldid
            }).DistinctBy(it=>it.Value);