【问题标题】:Get most common data from CSV File with LINQ使用 LINQ 从 CSV 文件中获取最常见的数据
【发布时间】:2012-06-29 21:14:26
【问题描述】:

我正在为我的工作制作一个项目,但有一个大问题...... 我正在制作一个软件,它从 CSV(逗号分隔值)文件中获取有关用户的信息。每个用户都有自己的电话号码和他被呼叫的号码。当从文件中收集信息时,我想获取一个数字的所有电话号码并将它们升序排序。我不想成为所有电话号码的出现,只是这个需要很长的时间。意思是这样的:

1-345345-9375683027
2-345345-3070982743
3-345345-9375683027
4-345345-3070982743
5-345345-9375683027
6-345345-2389479734
7-345345-2349875993

数字 1、3 和 5 相等。 数字 2 和 4 相等。 我想像这样对数字进行排序:

1-345345-9375683027
2-345345-3070982743
3-345345-2389479734
4-345345-2349875993

现在 1 我们最常见,2 比第一个更不常见,所以一个... 我正在尝试任何事情,但没有问题。 喜欢这个:

var result = user.transactions.where(x=>x.phone == user.phone);

如果您想查看我在此处制作的项目,请查看解决方案文件: http://mtelanalyzer.codeplex.com/

【问题讨论】:

    标签: c# linq distinct


    【解决方案1】:

    假设电话号码是List<String>

    var result = phoneNumbers.GroupBy(pn => pn)
                 .Select(grp => new { Number = grp.Key, Count = grp.Count() })
                 .OrderByDescending(x => x.Count)
                 .Select(x => x.Number);
    
    1. 按电话号码分组
    2. 选择一个匿名类型,以便能够按计数排序
    3. 按降序排列(出现次数最多的优先),然后按数字
    4. 选择数字,结果是IEnumerable<String>(或任何类型)

    编辑:我刚刚看到您不是按数字而是按索引排序的。这让它有点复杂:

    var result = phoneNumbers.Select((pn, i) => new { Number = pn, Index = i })
                 .GroupBy(x => x.Number)
                 .Select(grp => new { 
                     Number = grp.Key, 
                     Count  = grp.Count(), 
                     Index  = grp.First().Index 
                 })
                 .OrderByDescending(x => x.Count)
                 .ThenBy(x => x.Index)
                 .Select(x => x.Number);
    

    【讨论】:

    • 这是非常好的代码,再次感谢您。它是通用的,可以在任何地方使用。这对我现在的很多时候都有帮助。
    猜你喜欢
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    相关资源
    最近更新 更多