如何从某个位置的列表中获取项目
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]);
}
请考虑这种情况:
对于一些数学计算,我应该在 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]);
}