2011-01-03 16 views
12

2 dizenin birbirinden farklı olduğu ilk yeri elde etmek istiyorum. örnek: bu iki dizeleri : "AAAB" "AAAAC"Dizeleri karşılaştırma ve birbirinden farklı olan ilk yerlere ulaşma

Ben C# Nasıl yaptın sonucu 4.

almak istiyor? Bir LINQy çözümü için,

public static class StringExtensions { 
    public static int IndexOfDifferenceFrom(this string source, string compareTo) 
    { 
     for(var i = 0; i < source.Length && i < compareTo.Length; ++i) { 
      if (source[i] != compareTo[i]) { 
       return i; 
      } 
     } 

     return source.Length < compareTo.Length ? source.Length : compareTo.Length; 
    } 

} 

Veya:

+7

döngü için iyi bir eski için bir iş gibi geliyor. – marcog

+3

@marco: Evet, ancak LINQ çözümlerini bekliyorum. –

+3

Referans için, dilin geri kalanıyla tutarlı olmak istiyorsanız, konum 3'tür (4 değil). Hemen tüm C'ish dillerinde, dizelerin 'char indeksleri 0-tabanlıdır. – cHao

cevap

21

.NET 4: Aşağı

string a1 = "AAAB"; 
string a2 = "AAAAC"; 

int index = a1.Zip(a2, (c1, c2) => c1 == c2).TakeWhile(b => b).Count() + 1; 
+1

not: yalnızca .NET 4.0 – Jay

+1

Evet, ancak OP'yi 1-kökenli olduğu için +1 eklemelisiniz. –

+2

Bir sorun varsa, her zaman bir LINQ çözümü gibi görünüyor;) –

0

Yapacak hile bir uzantısı yöntemi oluşturabilir

var index = string1.Where((ch, i) => string2[i] == ch).Select((ch, i) => i).DefaultIfEmpty(-1).First(); 
0

Sonu'nu toCharArray karakter dizisinde dize ve bir döngüde her seferinde bir karakterle kontrol edin.

14
/// <summary> 
    /// Compare two strings and return the index of the first difference. Return -1 if the strings are equal. 
    /// </summary> 
    /// <param name="s1"></param> 
    /// <param name="s2"></param> 
    /// <returns></returns> 
    int DiffersAtIndex(string s1, string s2) 
    { 
     int index = 0; 
     int min = Math.Min(s1.Length, s2.Length); 
     while (index < min && s1[index] == s2[index]) 
      index++; 

     return (index == min && s1.Length == s2.Length) ? -1 : index; 
    } 
8
string str1 = "AAAB"; 
string str2 = "AAAAC"; 

// returns the first difference index if found, or -1 if there's 
// no difference, or if one string is contained in the other 
public static int GetFirstDiffIndex(string str1, string str2) 
{ 
    if (str1 == null || str2 == null) return -1; 

    int length = Math.Min(str1.Length, str2.Length); 

    for (int index = 0; index < length; index++) 
    { 
     if (str1[index] != str2[index]) 
     { 
      return index; 
     } 
    } 

    return -1; 
} 
+3

+1 aynı zaman karmaşıklığına sahip olduğu anlamına gelir. – Sapph

+0

Eğer chars eşit olmadığında geri dönecekseniz, işlevin sonunda -1 değerini döndürebilir ve başka bir tam dizenin genel giderlerinden kaçının. – Janiels

+0

@Jakob: Evet, güncellenen –

0
int index; 
int len = Math.Min(string1.Length, string2.Length); 
for (index = 0; index < len; index++) 
    if (string1[index] != string2[index]) 
     break; 

Bu nedenle sadece bir kişi tarafından sonuç olarak artırmak için, örneğin (sıfır-esaslı indeks) için "3" sağlayacaktır. vb

1
string one = "AAAB"; 
string two = "AAAAC"; 

int found = -1; 
int index = 0; 
while (one != two && found == -1 && one.Length > index && two.Length > index) 
{ 
    if (one[index] != two[index]) found = index; 
    index++; 
} 
0
int compare(String a, String b){ 

    for(int i = 0; i < min(a.length, b.length); i++){ 

     if(a.getCharAt(i) != b.getCharAt(i)){ 
     return i; 
     } 

    } 

    return -1; //a contained in b, or b contained in a 

} 

Yukarıdaki kod nulls böyle bir şey kontrol etmez,

+0

Huh, bu Java mı? Soru C# diyor ... –

3
static void Main(string[] args) 
{ 
    Console.WriteLine("enter s1 :"); 
    string s1 = Console.ReadLine(); 
    Console.WriteLine("enter s2 :"); 
    string s2 = Console.ReadLine(); 

    Console.WriteLine("note: zero means there is *no* first dif index starting from s1 ");  
    Console.WriteLine("first dif index of s1 :{0}", findFirstDifIndex(s1, s2)+1); 
} 

private static int findFirstDifIndex(string s1, string s2) 
{ 
    for (int i = 0; i <Math.Min(s1.Length, s2.Length); i++) 
     if (s1[i] != s2[i]) 
      return i; 

    return -1; 
} 
+0

S2 s1 – fredw

+1

dan daha kısa ise bu patlayacak, ben Min ekleyerek sabit –

İlgili konular