下拉列表 选择“基于列表中的文本属性进行非重复”

本文关键字:属性 文本 选择 于列表 列表 下拉列表 | 更新日期: 2023-09-27 18:34:54

我有一个要求,我需要为我的下拉值获取唯一/不同项目的列表。请参阅下面的示例,

示例数据

Id                Text
1                 AAA
2                 BBB
3                 AAA
4                 CCC
5                 BBB

我希望结果列表应该是,

Id                Text
1                 AAA
2                 BBB
4                 CCC

到目前为止我试过了

 var Value = (from x in db.Items
                     where ((x.CallNo.StartsWith(q) || x.CallNo.Contains(" " + q)) && (!string.IsNullOrEmpty(x.CallNo)))
                     select new
                     {
                         id = x.Id,
                         text = x.CallNo
                     }).Distinct().ToList();

意思是,我希望列表根据 Text 属性进行区分。而且,第一次出现。

下拉列表 选择“基于列表中的文本属性进行非重复”

你可以

简单地使用GroupByFirst

var Value = db.Items
    .Where(x => x.CallNo.StartsWith(q) || x.CallNo.Contains(" " + q)) && !string.IsNullOrEmpty(x.CallNo))
    .GroupBy(x => x.CallNo)
    .Select(g => g.First())
    .Select(x => new
        {
            id = x.Id,
            text = x.CallNo
        })
    .ToList();

如果您确实想按照标题的建议通过多个属性获取不同的对象,请在GroupBy中使用匿名类型。

.GroupBy(x => new { x.CallNo, x.OtherProperty})
如果要

在多个属性上定义组,方法如下:

List<something> myList= employee.GroupBy(p => new {p.employeeId, p.employeeName} )
  .Select(g => g.First())
  .ToList();

>Distinct有一个需要IEqualityComparer<TSource>的重载。因此,您可以编写一个比较器并提供它。
或者,可以编写DistinctBy(扩展(方法。你可以在Jon Skeet的MiscUtil库中找到它。但你也可以自己轻松编写:

public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> source,
    Func<T, TKey> keySelector, IEqualityComparer<TKey> comparer = null)
{
    var found = new HashSet<TKey>(comparer);
    return source.Where(element => found.Add(keySelector(element)));
}

编辑:我实际上指的是MoreLinq库,但MiscUtil也很有用。
请注意,此方法适用于IEnumerable,而不是IQueryable