无法使用SelectListitem获取不同的值
我正在尝试为下拉列表获取不同的值,但在使用以下语法时,它会将所有行返回给我。
有人可以告诉我如何使用正确的语法获得不同的值集?
IEnumerable ldidList = _db.TrafficHits.Select(c => new SelectListItem { Value = c.Id.ToString(), Text = c.ldid }).Distinct();
您当前代码的问题是Distinct
将使用SelectListItem
的默认比较器。 您需要提供这样的自定义比较器: –
public class SelectListItemComparer : IEqualityComparer { 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 ldidList = _db.TrafficHits.Select(c => new SelectListItem { Value = c.Id.ToString(), Text = c.ldid }).Distinct(new SelectListItemComparer());
您可以使用group by,然后选择每个组的第一个元素:
IEnumerable ldidList = _db.TrafficHits .GroupBy(t => t.Id) .Select(g => g.First()) .Select(c => new SelectListItem { Value = c.Id.ToString(), Text = c.ldid });
我很确定SelectListItem
没有值相等(即它不会覆盖Equals
)。 每个都将被引用等同,因此即使它们具有相同的值,您的所有项目也不会相等。
通过Id
假设您的“点击”是唯一的,请尝试:
var items = _db.TrafficHits .GroupBy(h => h.Id) .Select(g => new SelectListItem { Value = g.Key.ToString(), Text = g.First().ldid });