【问题标题】:Sort my List of records by the most frequent values then the next most frequent按最频繁的值排序我的记录列表,然后是下一个最频繁的值
【发布时间】:2016-02-24 23:21:19
【问题描述】:

对我的记录列表进行排序,以便首先显示具有最多共同值的记录。

I thought I found the solution in this link, but this only sorts by the first value.

我的未排序列表看起来像这样......

我希望我的排序列表看起来像这样......

我厌倦了基于上面链接的代码...

   lp = lp.GroupBy(x => x.Name)
              .OrderByDescending(g => g.Count())
              .SelectMany(g => g).ToList();


    dataGridView2.DataSource = lp;

但正如解释的那样,这仅按第一个最常见的项目排序。

【问题讨论】:

  • 您按名称分组,这似乎是唯一的,这是问题中的拼写错误还是您在代码中犯了同样的错误?我希望您希望按 Value1 分组,可能按 new { x.Value1, x.Value2, x.Value3 }
  • 不是故意的,因为它后来按最常见的记录排序。它只是不会按下一个最常见的字段和下一个等进行排序。
  • 名称列是否唯一?目前尚不清楚您要按哪一列/列进行排序。你能解释一下吗?
  • 你能解释一下“按下一个最常见的字段排序”的确切含义吗?您的意思是要选择是按 Value1、Value2、Value3 还是 Value4 排序,还是要按 Value1 排序并将该列中出现次数最多的值排在第一位?
  • 我想按具有最多共同点的记录(人)进行排序,即 Bob Steve 和 bill 的共同点最多。所以他们应该排在第一位,然后 Jim 和 Simon 的共同点最多,所以他们应该排在第二位。

标签: c# linq sorting


【解决方案1】:

试试这个:

var result = lp.OrderBy(c => c.Value1).ThenBy(n => n.Value2).ThenBy(n => n.Value3)

【讨论】:

  • 这依次按每个排序,我需要按具有最多相同值的行排序。我将在今天早上花费一个复杂的解决方案来解决这个问题,看看是否有人可以使用 linq 让它更流畅。
【解决方案2】:

如果我理解得很好……你可以试试这个

lp.Select(t => new {
    Thing = t, Coincidences = lp.Max(t2 =>
        t2 != t ?
        Convert.ToInt32(t2.Value1 == t.Value1) +
        Convert.ToInt32(t2.Value2 == t.Value2) +
        Convert.ToInt32(t2.Value3 == t.Value3) +
        Convert.ToInt32(t2.Value4 == t.Value4)
        : 0)
}).OrderByDescending(d => d.Coincidences).Select(d => d.Thing);

【讨论】:

    猜你喜欢
    • 2013-11-27
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    相关资源
    最近更新 更多