我写了一个程序,可以处理删除和更新,存储和搜索等文件和所有客户,我的代码自动为文件的每一行创建一个ID,但我不知道我做了什么的方式是对的。有更好的方法吗?
这就是我将整个文件读入变量的方式,然后文件的最后一行将是查找和ID行号加一,然后我返回
类BaseDataAccess中的代码方法CreateAutomicId:
public virtual int CreateAutomicId()
{
var alldata = FRepository.LoadAll();
var lastline = alldata.Last().Split(',');
var fetchId = Convert.ToInt32(lastline[0]);
var plusId = fetchId + 1;
return plusId;
}
答案 0 :(得分:3)
您的解决方案肯定不是线程安全的,如果多个实例同时尝试计算“下一个ID”,那么它们很容易发生冲突。
底层数据源是否有办法跟踪此内容?
在绝大多数情况下,这是首选方法。例如,在数据库中,您可以拥有一个标识列,其中数据库本身的内部工作方式保持下一个值的唯一性。您编写的代码不会为底层系统提供标识,底层系统会告诉您下一个标识是什么。
如果那不可能......
身份是否必须是整数?
如果没有,则System.Guid
是唯一标识符的现成来源。使用它可以消除对整个函数的需求,因为您需要生成下一个ID:
var nextID = Guid.NewGuid();
如果 需要是一个整数,那么......
身份是否需要连续?
您仍然可以使用Guid
创建.GetHashCode()
并将其转换为 very 唯一(尽管我认为not as unique as a Guid
)整数。如果您根本不需要保存Guid
,则可能是这样简单:
var nextID = Guid.NewGuid().GetHashCode();
或者,在你的功能背景下:
public virtual int CreateAutomicId()
{
return Guid.NewGuid().GetHashCode();
}
使用Guid
还可以从数据源中删除对读取的依赖关系,以生成“下一个”标识符,从而减少I / O瓶颈。
答案 1 :(得分:0)
有很多方法可以做到这一点:
首先使用NewGuid()函数,该函数位于System命名空间和Guid类下。
第二种方式是你可以使用日期和时间。我的意思是你可以将年,月,日,小时,秒和毫秒连接在一起,这样,你就可以按照id生成过程的日期,并根据毫秒产生唯一的Id。
最后一个是DateTime对象中的Ticks。这非常有用。它生成唯一的Int-64大小编号,这是我最喜欢做同样事情的方法。您可以使用它:DateTime.Now.Ticks.ToString()
我希望这些optoins会帮助你。