c# - 如何根据类型 ID 在 C# 中增量分配整数(如最后一列)
问题描述
数据驻留在 SQL 数据库中,按类型和类型 ID 分组。每当遇到新的类型 id 时,都需要像最后一列一样分配一个整数。
类型 | 类型 ID | 特征 | 价值观 | 分配的整数 |
---|---|---|---|---|
轿跑车 | 123 | 颜色 | 红色的 | 1 |
轿跑车 | 123 | 引擎 | 汽油 | 1 |
轿跑车 | 123 | 制动 | ABS | 1 |
轿跑车 | 123 | 安全 | 好的 | 1 |
轿跑车 | 123 | 转向 | 汽车 | 1 |
轿跑车 | 123 | 座椅 | 四 | 1 |
轿车 | 589 | 颜色 | 蓝色的 | 2 |
轿车 | 589 | 引擎 | 柴油机 | 2 |
轿车 | 589 | 制动 | 时差 | 2 |
轿车 | 589 | 安全 | 五星 | 2 |
轿车 | 589 | 转向 | 水电 | 2 |
轿车 | 589 | 座椅 | 二 | 2 |
解决方案
好的,我仍然不是 100% 清楚数据是否保留在数据库中,并且 c# 会进行一个查询来分配它,或者 c# 是否会下载它并分配它但是..
如果数据保留在 DB 中(或 db 应计算计数),一种方法是让 db 加入不同 typeid 的子查询和递增计数。加入后会重复以独特的 typeid-country 配对开始的内容
SELECT *
FROM main
INNER JOIN (
SELECT typeid, ROW_NUMBER() OVER(ORDER BY typeid) as ctr
FROM (
SELECT DISTINCT typeid FROM main
) x
) y on y.typeid = main.typeid
我们得到唯一的类型 id,我们对它们进行递增编号,然后我们将这个集合加入到表中
还有其他方法,例如运行求和一列,该列主要为 0,但每次排序类型列表从行到行更改时为 1(实际上是SUM(CASE WHEN LAG(typeid) = typeid THEN 0 ELSE 1 END) OVER(ORDER BY typeid)
因为嵌套了窗口函数,但比这更复杂)
如果您在 c# 中执行此操作并且您已将数据下载到例如列表或数据表中,那么与上述“如果自上次以来行值发生变化”的逻辑相同:
var last = int.MinValue; var ctr = 0;
foreach(var x in myListOfThings) {
if(x.TypeId != last) {
ctr++;
last = x.TypeId;
}
x.UniqueCtr = ctr;
}
该列表需要按 typeid 排序。如果这还没有完成,foreach(var x in myListOfThings.OrderBy(t => t.TypeId))
如果您想避免排序,则需要改用字典来跟踪您之前是否看到过 typeid 以及如果您确实看到了它/如果您在分配之前没有看到此 typeid 分配给它的 ctr 一个(ctr++)。这看起来更像:
var d = new Dictionary<int, int>(); var ctr = 1;
foreach(var x in myListOfThings) {
if(!d.ContainsKey(x.TypeId))
d[x.TypeId] = ctr++;
x.UniqueCtr = d[x.TypeId];
}
您可以按照 typeid 在列表中第一次遇到的任何顺序获得分配的数字
推荐阅读
- javascript - 如何修复“TypeError:无法获取”?
- go - go.mod 在 v2.0.0 版本中具有 post-v2 模块路径
- c++ - 程序收到信号 SIGSEGV,在代码块中调试时出现分段错误
- python - 我可以将参数传递给 python 中的 paho 回调函数吗?
- scala - 在多个 Spark SBT 项目中创建可共享的代码
- php - 将规则重定向到 php 查询,但删除请求的 url 中的任何查询字符串
- google-apps-script - 查找和替换脚本中的完全匹配
- python - KeyError:“['class']”在轴中找不到
- rounding - 四舍五入到最接近的 5 美元
- c# - 为什么 RunWithElevatedPrivileges 在 itemAdded eventreceiver 中不起作用?