【问题标题】:C# - Any clever way to get an int array from an object collection?C# - 从对象集合中获取 int 数组的任何巧妙方法?
【发布时间】:2010-08-09 23:30:10
【问题描述】:

如何创建一个简单的辅助方法来从对象集合中获取一个 int 数组?

这个想法是有一个接收“用户”类集合的方法:

public class User { 
    public int UserId {get;set;}
    public string UserName {get;set;}
}

并过滤此集合以获取唯一 UserId 的 int 数组。

List<int> repeatedUserIds = (from item in list 
                             select item.UserId).ToList();
List<int> uniqueUserIds = ((from n in repeatedUserIds 
                             select n).Distinct()).ToList();

有没有办法为此目的创建一个聪明的方法?

【问题讨论】:

    标签: linq arrays c#-3.0 filtering arraycollection


    【解决方案1】:

    你可以创建一个扩展方法:

    public int[] GetUniqueIds<T>(this IEnumerable<T> items, Func<T, int> idSelector)
    {
        return items.Select(idSelector).Distinct().ToArray();
    }
    

    并像这样使用它:

    int[] uniqueUserIds = list.GetUniqueIds(u => u.UserId);
    

    【讨论】:

    • 扩展方法很棒。我已经将 ToArray() 改编为 ToList(),添加了 static 关键字,它运行良好。谢谢李
    【解决方案2】:

    好吧,就个人而言,我不会打扰查询表达式 - 但其余的都很好:

    List<int> repeatedUserIds = list.Select(item => item.UserId)
                                    .ToList();
    List<int> uniqueUserIds = repeatedUserIds.Distinct()
                                             .ToList();
    

    如果您不需要 repeatedUserIds 做其他任何事情,请不要打扰对 ToList() 的中间调用:

    List<int> uniqueUserIds = list.Select(item => item.UserId)
                                  .Distinct()
                                  .ToList();
    

    (我通常喜欢将每个操作放在单独的一行,但当然你不必这样做。)

    请注意,您的 text 要求提供一个数组,但您的 代码List&lt;int&gt;。如果您真的想要 int[] 而不是 List&lt;int&gt;,只需将 ToList() 调用更改为 ToArray()

    【讨论】:

      【解决方案3】:
       List<int> uniqueUserIds = (from n in list  
                                  select item.UserId).Distinct().ToList(); 
      

      【讨论】:

        猜你喜欢
        • 2016-04-19
        • 2012-04-24
        • 1970-01-01
        • 1970-01-01
        • 2023-02-10
        • 1970-01-01
        • 1970-01-01
        • 2021-07-24
        • 2021-09-05
        相关资源
        最近更新 更多