2017-04-25 42 views
0

假设我有一个字符串,说转换一个句子整数

string version = "Version 1.0.2.3" 

我想这个转换为整数或数字,如“1232454982394”。 这应该根据我输入的文字进行更改。 虽然有一个选项是转换为ascii值或unicode,我必须遍历每个字符。想知道是否有一种更简单的方法 - 就像可以实现这一点的单行方法。

下面的工作。但我正在寻找更好的东西

string version = "Version 1.0.2.3"; 
string finalOutput = ""; 
foreach (char c in version) 
{ 
    finalOutput = finalOutput + ((int)c).ToString(); 
} 

Console.WriteLine(finalOutput); 
// Output is 861011141151051111103249464846504651 
+7

它几乎听起来像你要求散列没有使用单词散列。为什么不使用[String.GetHashCode](https://msdn.microsoft.com/en-us/library/system.string.gethashcode(v = vs.110).aspx)?你想做什么? –

+0

你想解决什么*实际*问题?为什么你认为你需要从一个字符串中产生一个数字来解决它?你想要什么样的号码?为什么不为所有字符串返回1?或者第一个或最后一个字符的整数值?除非你解释*你想要什么和为什么*,否则不可能回答。 –

+1

听起来像代码高尔夫 – pm100

回答

1

一种方法是使用GetHashCode方法。

string version = "Version 1.0.2.3"; 
var hashedValue = version.GetHashCode(); 

MSDN

的哈希代码是用于插入并识别在基于散列的集合的 对象如 词典(TKEY的,TValue)类的数字值,Hashtable类或从DictionaryBase类派生的 类型。 GetHashCode方法为需要快速检查对象 相等性的算法提供 这个散列码。

+1

谢谢@agalo - 是的这个工程。 –

+4

@PanagiotisKanavos:如果运行在不同版本的.NET上,相同的字符串可能会导致不同的哈希码。在发生散列冲突时,不同的字符串可能会导致相同的数字。 (虽然不是我的投票。) – hvd

+1

@ hvd给出了问题的模糊性和版本字符串的大小,我不认为这很重要。 'GetHashCode()'只是一个*实现。鉴于OP希望将其附加到版本字符串,构建时的刻度值也同样有用。或者*文件内容*的简短散列,就像Git那样 –

0

我真的不喜欢GetHashCode选项以此为版本间隔会比哈希间隔

string Version1023 = "Version 1.0.2.3"; 
string Version1024 = "Version 1.0.2.4"; 
string Version1033 = "Version 1.0.3.3"; 
string Version1034 = "Version 1.0.3.4"; 
Console.WriteLine(Version1023 + " => " + Version1023.GetHashCode()); 
Console.WriteLine(Version1024 + " => " + Version1024.GetHashCode()); 
Console.WriteLine(Version1033 + " => " + Version1033.GetHashCode()); 
Console.WriteLine(Version1034 + " => " + Version1034.GetHashCode()); 

/* =====[ Results ]===== 
    Version 1.0.2.3 => -674112888 
    Version 1.0.2.4 => -1433627775 
    Version 1.0.3.3 => -674112889 
    Version 1.0.3.4 => -1433627776 
*/ 

我会建议,且仅当该字符串将不同保持相同的格式,将字符串split集中在版本数字部分。对于四元素版本号,我们可以使用通用脚本来将IP4地址转换为long地址。 这里是一个略低扭捏版本做这种分裂和转换

public static long GetLongFromVersion(string VersionString) { 
    string[] VersionSplit = VersionString.Split(` `); 
    string VersionNumber = VersionSplit[1]; 
    string[] VersionBytes; 
    double num = 0; 

    if (!string.IsNullOrEmpty(VersionNumber)) { 
     VersionBytes = VersionNumber.Split(`.`); 
     for (int i = VersionBytes.Length - 1; i >= 0; i--) { 
      num += ((int.Parse(VersionBytes[i]) % 256) * Math.Pow(256, (3 - i))); 
     } 
    } 
    return (long)num; 
} 

而当我们使用这种方法的版本号转换,版本和结果将具有平行间隔。

string Version1023 = "Version 1.0.2.3"; 
string Version1024 = "Version 1.0.2.4"; 
string Version1033 = "Version 1.0.3.3"; 
string Version1034 = "Version 1.0.3.4"; 
Console.WriteLine(Version1023 + " => " + GetLongFromVersion(Version1023)); 
Console.WriteLine(Version1024 + " => " + GetLongFromVersion(Version1024)); 
Console.WriteLine(Version1033 + " => " + GetLongFromVersion(Version1033)); 
Console.WriteLine(Version1034 + " => " + GetLongFromVersion(Version1034)); 

/* =====[ Results ]===== 
    Version 1.0.2.3 => 16777731 
    Version 1.0.2.4 => 16777732 
    Version 1.0.3.3 => 16777987 
    Version 1.0.3.4 => 16777988 
*/ 
+0

这不会奏效 - 我在其中一个评论中提到实际值看起来像“app 01-23.217-beta/rel 4.0 xxxxcompanyName”。 –

+0

如果你能想出一个标准格式来描述版本值的划分方式,你可以使用它来解析任何格式。关键是要制定标准。如果你需要跟踪实际的版本号,这会让它变得更容易。 –