2015-11-14 66 views
2

我想比較兩個字符串在C#中,但我無法找到一種方法來獲得我需要的結果,而無需自己構建的東西。得到兩個字符串的公共前綴

的字符串:

TestasdOne
TestasdTwo

結果:

Testasd

我試着LINQ,但它不能得到WOR ķ。 我試過Google。

在此先感謝。

+2

你需要什麼結果? –

+0

我很驚訝沒有人可以找到一個副本呢。 –

回答

5

這裏是非LINQ版本,這是更有效的,清晰可讀

public static string CommonPrefix(string a, string b) 
{ 
    if (a == null) 
     throw new ArgumentNullException(nameof(a)); 

    if (b == null) 
     throw new ArgumentNullException(nameof(b)); 

    var min = Math.Min(a.Length, b.Length); 
    var sb = new StringBuilder(min); 
    for (int i = 0; i < min && a[i] == b[i]; i++) 
     sb.Append(a[i]); 

    return sb.ToString(); 
} 

使用它像

Console.WriteLine(CommonPrefix("TestasdOne", "TestasdTwo")); //Testasd 
+0

包含字符串數組版本的任何可能性? – windowskm

+0

我會去計算前綴和單個子字符串操作的長度。看到答案: –

3

使用linq你可以做到這一點。而它的字符是等於在相同的索引第二列的文字

string str1 = "TestasdOne"; 
string str2 = "TestasdTwo"; 

string similar = string.Join("", str1.TakeWhile((ch, i) => i < str2.Length && str2[i] == ch)); 

這將需要第一個字符串的字符。

+0

謝謝:)我第一次使用TakeWhile很有用。 –

1

的溶液可能是一個擴展方法添加到LINQ,將工作對於字符串,以及任何IEnumerable<T>

這是一種小型函數,當你感覺他們錯過Linq時,它們會很快寫入。

public static class CommonPartExtension 
{ 
    public static IEnumerable<T> CommonPart<T>(this IEnumerable<T> source1, 
                IEnumerable<T> source2) 
    { 
     IEnumerator<T> enumerator1 = source1.GetEnumerator(); 
     IEnumerator<T> enumerator2 = source2.GetEnumerator(); 
     while(enumerator1.MoveNext() && enumerator2.MoveNext()) 
     { 
      if (enumerator1.Current.Equals(enumerator2.Current)) 
       yield return enumerator2.Current; 
      else 
       yield break ; 
     } 
    } 
} 

用法:

 string s1 = "TestasdOne"; 
     string s2 = "TestasdTwo"; 
     Console.WriteLine("CommonPart " + 
      new String(s1.CommonPart(s2).ToArray())); 

問候

0

這裏是字符串的任意陣列,並與一些優化的解決方案。我不會即時編寫結果,而是計算長度。

private static string GetCommonPrefix(params string[] values) 
    { 
     string result = string.Empty; 
     int? resultLength = null; 

     if (values != null) 
     { 
      if (values.Length > 1) 
      { 
       var min = values.Min(value => value.Length); 

       for (int charIndex = 0; charIndex < min; charIndex++) 
       { 
        for (int valueIndex = 1; valueIndex < values.Length; valueIndex++) 
        { 
         if (values[0][charIndex] != values[valueIndex][charIndex]) 
         { 
          resultLength = charIndex; 
          break; 
         } 
        } 

        if (resultLength.HasValue) 
        { 
         break; 
        } 
       } 

       if (resultLength.HasValue && 
        resultLength.Value > 0) 
       { 
        result = values[0].Substring(0, resultLength.Value); 
       } 
      } 
      else if (values.Length > 0) 
      { 
       result = values[0]; 
      } 
     } 

     return result; 
    }