C# 检查int是否为101001000,
我的应用程序中有一个部分,当指定的数字得到一个额外的数字时,它需要做一些事情(=>在其他数字前面添加填充0),这意味着它得到10、100、1000等等 目前,我使用以下逻辑:C# 检查int是否为101001000,,c#,numbers,C#,Numbers,我的应用程序中有一个部分,当指定的数字得到一个额外的数字时,它需要做一些事情(=>在其他数字前面添加填充0),这意味着它得到10、100、1000等等 目前,我使用以下逻辑: public static bool IsNewDigit(this int number) { var numberString = number.ToString(); return numberString.StartsWith("1") && numberString
public static bool IsNewDigit(this int number)
{
var numberString = number.ToString();
return numberString.StartsWith("1")
&& numberString.Substring(1).All(c => c == '0');
}
我能做的是:
if (number.IsNewDigit()) { /* add padding 0 to other numbers */ }
对我来说,使用字符串转换似乎是一种“黑客行为”。是否有更好的方法(甚至可能是“内置的”)来做到这一点 更新:
我需要这个的一个例子:
我有一个具有以下(简化)结构的项目:
public class Item
{
public int Id { get; set; }
public int ParentId { get; set; }
public int Position { get; set; }
public string HierarchicPosition { get; set; }
}
hierarcycposition
是自己的位置(带填充)和父级hierarcycposition
。例如,一个项目是位置2的项目的12个第3个子项,其2.03
作为其层次位置
。这也可能是更复杂的问题,如011.7.003.2.02
然后,该值用于在类似“树状视图”的结构中非常容易地对项目进行排序 现在我有了一个
IQueryable
,希望添加一个项目作为另一个项目的最后一个子项。为了避免需要重新创建所有的层次结构位置
,我想检测(有问题的逻辑)新位置是否添加了新数字:
Item newItem = GetNewItem();
IQueryable<Item> items = db.Items;
var maxPosition = items.Where(i => i.ParentId == newItem.ParentId)
.Max(i => i.Position);
newItem.Position = maxPosition + 1;
if (newItem.Position.IsNewDigit())
UpdateAllPositions(items.Where(i => i.ParentId == newItem.ParentId));
else
newItem.HierarchicPosition = GetHierarchicPosition(newItem);
因此,我不能使用I计数器
(或通过“代码”排序的其他东西)。这将返回具有
层次位置的项目,如(pageSize=10
):
03.04
03.05
04
04.01
04.01.01
04.01.02
04.02
04.02.01
04.03
05
更新#3:
我喜欢具有双
值的替代解决方案,但我有一些“更复杂的情况”,如以下我不是舒尔,我可以用它来解决:
我正在(作为许多人的一部分)建立一个图像库,它有类别
和图像
。一个类别可以有一个父级和多个子级,每个图像都属于一个类别(在我的逻辑中,我称它们为Holder
和Asstes
——因此每个图像都有一个Holder,每个类别都可以有多个资产)。这些图像首先按类别位置排序,然后按其自身位置排序。我通过组合HierarchicPosition
像HolderHierarchicPosition#ItemHierarchicPosition
这样的HierarchicPosition来实现这一点。因此,在以02.04
作为其位置和120个图像的类别中,第三个图像将获得02.04\003
我甚至有一些“三级”(未来可能会更高)的案例,如03.1#02#04
我是否可以调整“双重解决方案”以支持此类场景
注:对于我的基数问题,我也愿意接受其他解决方案。您可以检查数字的10进制对数是否为整数。(10->1100->2100->2100->3,…)
一般来说,这也可以简化您的算法。不要每次发现较大的内容时都添加一个0填充,只需跟踪看到的最大数量,然后取length=floor(log10(number))+1
,确保所有内容都填充到length
。这一部分不存在与整数比较类似的浮点算术问题。从您的描述来看,您的层次位置位置应该保持项目的顺序,并且您遇到了一个问题,即当您拥有ID1..9
并添加10
时,您将在某个地方获得订单1,10,2,3,4,5,6…
,因此要向左移动到01,02,03…,10
-正确吗
如果我是对的,请先看一下:
因为你试图做的是以某种方式解决问题但可能有更有效的方法来真正解决这个问题。(因此,您最好询问您的实际问题,而不是您试图实施的解决方案)
有关解决方案,请参见此处,使用自定义IComparator以本机方式对字符串(实际上是数字)进行排序:
有关您的更新的更新:
通过像您这样提供排序“字符串”,您可以在“某处”插入一个元素,而无需对所有后续项重新编制索引,就像对整数值一样。(这似乎就是目的)
不必构建复杂的“字符串”,您可以使用双精度值快速获得相同的结果:
如果在两个现有项之间插入一个项,则只需执行以下操作:this.sortingValue=(previor.sortingValue+next.sortingValue)/2
并在列表末尾插入时处理大小写
假设您按以下顺序添加元素:
1 First Element // pick a double value for sorting - 100.00 for example. -> 100.00
2 Next Element // this is the list end - lets just add another 100.00 -> 200.00
1.1 Child // this should go "in between": (100+200)/2 = 150.00
1.2 Another // between 1.1 and 2 : (150+200)/2 = 175
现在根据该双字段进行简单排序时,顺序为:
100.00 -> 1
150.00 -> 1.1
175.00 -> 1.2
200.00 -> 2
要添加1.1.1
?伟大:position=(150.00+175.00)/2代码>
只要新值达到x.5
*时,您可以简单地将所有值乘以10,以确保小数位数不会用完(但您不必-拥有.5.25.125…
不会影响排序):
因此,在添加1.1.1
之后,即162,5
,将所有值乘以10:
1000.00 -> 1
1500.00 -> 1.1
1625.00 -> 1.1.1
1750.00 -> 1.2
2000.00 -> 2
因此,每当您在周围移动项目时,只需通过查看n-1
和n+1
重新计算n
的位置即可
根据每个条目的预期孩子数,您可以从“1000.00”、“10.000”或最匹配的任何内容开始
我没有考虑的是:当你想把“2”移到顶部时,你需要重新计算“2”的所有子项,使其值介于排序值“2”和现在的“下一个”项之间。。。可能会让人头疼:)
具有“双”值的解决方案有一些限制,但适用于较小的组集。然而,您所谈论的是“组、子组和计数为100的图片”-因此另一个解决方案是
1000.00 -> 1
1500.00 -> 1.1
1625.00 -> 1.1.1
1750.00 -> 1.2
2000.00 -> 2