2010-08-27 13 views
2

J'ai vu ce question qui demande une chaîne "smith; rodgers; McCalne" comment pouvez-vous produire une collection. La réponse à ceci était d'utiliser String.Split.Quelles sont les alternatives à Split une chaîne dans C# qui n'utilisent pas String.Split()

Si nous n'avons pas Split() construit dans ce que vous faites à la place?

Mise à jour:

Je reconnais l'écriture d'une fonction de répartition est assez facile. Voici ce que j'aurais écrit. Boucle à travers la chaîne en utilisant IndexOf et extrait en utilisant Substring.

string s = "smith;rodgers;McCalne"; 

string seperator = ";"; 
int currentPosition = 0; 
int lastPosition = 0; 

List<string> values = new List<string>(); 

do 
{ 
    currentPosition = s.IndexOf(seperator, currentPosition + 1); 
    if (currentPosition == -1) 
     currentPosition = s.Length; 

    values.Add(s.Substring(lastPosition, currentPosition - lastPosition)); 

    lastPosition = currentPosition+1; 

} while (currentPosition < s.Length); 

J'ai pris un coup d'oeil à la mise en œuvre et son SSCLI similaire à ce qui précède, sauf qu'il gère ainsi plus de cas d'utilisation et il utilise une méthode dangereuse pour déterminer les indices des séparateurs avant d'effectuer l'extraction de sous-chaînes.

D'autres ont suggéré ce qui suit.

  1. Une méthode d'extension qui utilise un bloc itérateur
  2. suggestion Regex (pas de mise en œuvre)
  3. Linq méthode globale

Est-ce cela?

+4

Je ne comprends pas la question; n'est pas la réponse "écrire une méthode Split"? Ce n'est pas du tout une méthode difficile à écrire. –

+5

Faisons-le sans IndexOf(). Bonus pour ne pas utiliser System.String du tout. –

Répondre

9

Il est relativement simple d'écrire son propre équivalent Split.

Voici un exemple rapide, bien qu'en réalité vous voudriez probablement créer des surcharges pour plus de flexibilité. (Eh bien, en réalité vous souhaitez simplement utiliser le cadre intégré de méthodes Split!)

string foo = "smith;rodgers;McCalne"; 
foreach (string bar in foo.Split2(";")) 
{ 
    Console.WriteLine(bar); 
} 

// ... 

public static class StringExtensions 
{ 
    public static IEnumerable<string> Split2(this string source, string delim) 
    { 
     // argument null checking etc omitted for brevity 

     int oldIndex = 0, newIndex; 
     while ((newIndex = source.IndexOf(delim, oldIndex)) != -1) 
     { 
      yield return source.Substring(oldIndex, newIndex - oldIndex); 
      oldIndex = newIndex + delim.Length; 
     } 
     yield return source.Substring(oldIndex); 
    } 
} 
1

Regex?

Ou juste Substring. C'est ce que Split fait en interne

+0

Haha, je pense que le PO demande essentiellement comment une méthode de split est implémentée. –

2

Vous faites votre propre boucle pour faire la scission. En voici un qui utilise la méthode d'extension Aggregate. Pas très efficace, car il utilise l'opérateur += sur les cordes, donc il ne devrait pas vraiment être utilisé comme quoi que ce soit, mais un exemple, mais cela fonctionne:

string names = "smith;rodgers;McCalne"; 

List<string> split = names.Aggregate(new string[] { string.Empty }.ToList(), (s, c) => { 
    if (c == ';') s.Add(string.Empty); else s[s.Count - 1] += c; 
    return s; 
}); 
Questions connexes