使用LINQ从CSV文件中获取最常见的数据

时间:2012-06-29 21:14:26

标签: c# linq distinct

我正在为我的工作制作一个项目,这是一个很大的问题...... 我正在制作一个软件,从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/

1 个答案:

答案 0 :(得分: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>(或任何类型)
  5. <击> 编辑:我刚刚看到你订购的第二个不是按编号而是按索引编号。这使它更复杂一点:

    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);
    

    <击>