【问题标题】:Get the number of distinct property values in List<T> using LINQ in C#在 C# 中使用 LINQ 获取 List<T> 中不同属性值的数量
【发布时间】:2016-06-01 20:28:24
【问题描述】:

List&lt;MyClass&gt; ListOfMyClasses 列表中,如何使用 LINQ 获得有多少不同的 GroupId 属性值?

public class MyClass
{
     public int GroupId;
}

例如,假设我们有这个列表:

ListOfMyClasses: {MyClass1 (GroupId = 1), MyClass2 (GroupId = 3), MyClass3 (GroupId = 1)}

这里我们应该得到结果为 2(GroupId 的两个不同数字)。

【问题讨论】:

  • this SO问题。

标签: c# linq list group-by distinct


【解决方案1】:

这是使用Distinct 的一种方法:

ListOfMyClasses.Select(t => t.GroupId).Distinct().Count()

或者你也可以使用GroupBy:

ListOfMyClasses.GroupBy(t => t.GroupId).Count()

【讨论】:

    【解决方案2】:

    这应该适合你。

    var result = list.Select(x => x.GroupId).Distinct().Count();
    

    首先,您要选择所有GroupIds。然后,您将它们过滤为不同的。最后,您将获得这些值的计数。

    【讨论】:

      【解决方案3】:

      另外,只是想分享一些我在所有项目中使用的扩展,它也解决了你的任务

      public class EqualityComparer<TEntity, TProperty>: IEqualityComparer<TEntity>
      {
          private readonly Func<TEntity, TProperty> _property;
      
          public EqualityComparer(Func<TEntity, TProperty> property)
          {
              _property = property;
          }
      
          public bool Equals(TEntity x, TEntity y)
          {
              return _property(x).Equals(_property.Invoke(y));
          }
      
          public int GetHashCode(TEntity obj)
          {
              return _property(obj).GetHashCode();
          }
      }
      
      public static class Extensions
      {
          public static IEnumerable<T> DistinctByProperty<T, TProp>(this IEnumerable<T> source, Func<T, TProp> propertyFunc)
          {
              return source.Distinct(new EqualityComparer<T, TProp>(propertyFunc));
          }
      }
      

      它允许你写ListOfMyClasses.DistinctByProperty(x =&gt; x.GroupId).Count()

      【讨论】:

        猜你喜欢
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-04
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多