2011-12-01 84 views
7

我正在做哈希。我正在哈希一个短语,我只能使用该短语的20个字符。如何从字符串中只读取20个字符并与其他字符串进行比较?

如何只读取一个字符串的20个字符?

如何比较字符串,如果他们是相同的?

+3

“建议假人的示例。” +1为你的诚实! – spender

+5

如果你正在做哈希,为什么你需要截断你的字符串为20个字符?无论源数据的长度是多少,经典哈希算法都会产生固定大小的结果。 –

+0

我不知道谁接受!我正在为大家投票选出非常好的答案。但我必须混合搭配。 – NewHelpNeeder

回答

9

要读取,你可以使用一个字符串的20个字符固定

您只能在可枚举做到这一点子串方法。所以

myString = myString.Substring(0,20); 

将返回前20个字符。但是,如果您的字符少于20个字符,这会引发异常。你可以像这样做一个方法来给你第一个20,或者如果它更短,所有的字符串。

string FirstTwenty(string input){ 
    return input.Length > 20 ? input.Substring(0,20) : input; 
} 

然后比较他们

if(FirstTwenty(myString1).CompareTo(FirstTwenty(myString2)) == 0){ 
    //first twenty chars are the same for these two strings 
} 

如果大写然后使用此功能

if (FirstTwenty(mystring1).Equals(FirstTwenty(myString2), StringComparison.InvariantCultureIgnoreCase)) 
    { 
     //first twenty chars are the same for these two strings 
    } 
+2

C#有运算符重载也一样,你应该只使用''== –

4

字符串比较字符串:

bool stringsAreEqual = str1 == str2; 

从字符串读头20个字符(很放心的方式):

string first20chars = string.IsNullOrEmpty(str) 
       ? str 
       : str.Length >= 20 
         ? str.Substring(0, 20) 
         : str; 
+0

为什么你把'?:'放在新的字符串上,而通常它们放在同一个字符串中?只是好奇。 – abatishchev

+0

@abatishchev:你的意思是什么*新字符串*?我只是检查空和长度<20 – Jan

+0

嗨,1月,我想问一个关于你的代码的问题。我在我的代码中非常频繁地使用这种表达式,但我通常使用'string.IsNullOrWhiteSpace'。为什么你使用' string.IsNullOrEmpty'但不是'IsNullOrWhiteSpace'?这两者之间是否有特殊的原因或差异? – Bastardo

11

这个比较字符串a和的前20个字符b

if (String.Compare(a, 0, b, 0, 20) == 0) 
{ 
    // strings are equal 
} 

文化的具体比较规则,你CA氮素利用此重载,接受一个StringComparison enum

if (String.Compare(a, 0, b, 0, 20, StringComparison.CurrentCultureIgnoreCase) == 0) 
{ 
    // case insensitive equal 
} 
+5

+1酷超载, – sll

+2

之前从来不知道它为什么具有手动串如果有内置的功能+1 +1 – dasheddot

+2

不知道这个过载或者摆弄周围,它实际上是相当有用:) –

0

使用Linq!

if(new string(yourString.Take(20).ToArray()) == otherString.Take(20)) 
    .... 

编辑 正如评论所说,改变了IEnumerable返回字符串。

if(yourString.Take(20).SequenceEqual(other.AsEnumerable()) 
    .... 

如果你只是想检查字符串的开始:

if(yourString.Take(20).SequenceEqual(other.Take(20)) 
    .... 
+2

您正在做一个'IEnumerable '和一个'string'的引用相等。编译器甚至在这种情况下发出警告:*»警告CS0252:可能的意外参考比较;为了得到一个值的比较,左手边输入'string'«* – Joey

+0

我从来没有使用过Linq。但是它的可读性远远超过了'return yourString.Length> 20? yourString.SubString(0,20):yourstring;'。 +1 –

+0

将无法​​工作,'IEnumerable.Take'返回另一个'IEnumerable',which'll反过来说''==到参考平等检查 –

4

子字符串在C#中String类返回一个新字符串,它是此字符串的一个子。子字符串从指定的给定索引开始并扩展到给定的长度。

str = "This is substring test"; 
retString = str.Substring(5, 7); // "is" 

在你的情况,你必须使用

str.substring(0,20); 

比较两个字符串使用String.Equals()

String a = "Hello"; 
String b = "World"; 
if(a.Equals(b, true)); 

不理你必须使用字符串的情况下,“真”。

相关问题