首页 > 解决方案 > 如何根据类型 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

标签: c#

解决方案


好的,我仍然不是 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 在列表中第一次遇到的任何顺序获得分配的数字


推荐阅读