如何从某个位置的列表中获取项目

How to get item from a list that position in a certain place

请考虑这种情况:

对于一些数学计算,我应该在 sorted 列表中的特定位置找到一个数字。例如考虑这个列表:

1 - 2 - 3 - ... 17 - 18 - 19 - 20

我应该找到计数 25% 中的数字 (count / 4)。在上面的系列中我应该得到 5。值得注意的是我们没有循环计数,但这不是问题。

现在考虑这个 table:

Type            Number
----------------------
  1               10
  1               11
  1               12
  1               13
  2               22
  2               23
  2               24
  2               25
  2               26
  2               27
  2               28
  3               39
  3               38
  3               37
  3               36
  3               35
  3               34
  3               33
  3               32
  4               41
  4               43
  4               42
  4               44
  4               45
  4               47
  4               46
  4               48
  4               49
  4               50
  4               51

Another point is I'm sure that in every Type I have at least 1000 numbers, so above data in just for example.

根据以上数据我想得到这样的结果:

Type            Number
----------------------
  1               11
  2               23
  3               33
  4               43

实现此结果的一种方法是循环抛出不同的 Type 并获取数字列表,然后对其进行排序,然后计算该列表的计数并将其除以 4,然后将结果四舍五入并得到特定的Number 已获取索引

但是这种方法的问题是它需要很多数据库连接(每个 Type 连接一个)。是否有更好的解决方案可以通过 1 个连接和 1 个查询执行获得所需的结果。谢谢

有趣的谜题。在 Sql 服务器中,您可以使用类似以下查询的内容;

select a.*
from (
    select *, row_number() over(partition by type order by number) as row_number
    from table_name
) a
join (
    select type, count(*) as count
    from table_name
    group by type
) b on a.type = b.type
where a.row_number = b.count/4

(当 count%4 != 0 时随心所欲地四舍五入)

但我想不出如何将其构建为 linq 表达式。

 var percent = 0.25;
 var val = res.GroupBy(x => x.type)
              .ToDictionary(x => x.Key, x => x.OrderBy(y=>y).ToList());
 var valuesTobeTaken = val.Select(x => new 
                              { 
                                 x.Key, 
                                 index = ((int)Math.Round(x.Value.Count * percent))-1 
                               });

Edge cases are not handled and the code is not too much optimized. You can work on that i guess

        foreach (var rec in valuesTobeTaken)
        {
            Console.WriteLine(val[rec.Key][rec.index]);
        }