A version of Split string that returns an IEnumerable<string> rather than an array.
Only single separate string is allowed, it is very rare that an array of separator
strings is required.
public static class StringSplitExtensions { public static IEnumerable<string> Split2( this string targetStr, string separator ) { if ( targetStr == null ) yield break; if ( string.IsNullOrEmpty( separator ) ) { yield return targetStr; } else { string str = targetStr; bool finished = false; int startIx = 0; int sepLength = separator.Length; while ( !finished ) { var ix = str.IndexOf( separator, StringComparison.OrdinalIgnoreCase ); if ( ix == -1 ) { finished = true; yield return str; } else { string res = str.Substring( 0, ix ); yield return res; startIx = ix + sepLength; str = str.Substring( startIx, str.Length - startIx ); } } } } } [ Test ] public void SplitTest() { string test = "012 3456\t7890\ta aaa\tbbbb\t"; var res2 = test.Split2( "\t" ).ToArray(); var norm2 = test.Split( '\t' ); Assert.IsTrue( AreTheSame( res2, norm2 ) ); var res3 = "".Split2( "\t" ).ToArray(); var norm3 = "".Split( '\t' ); Assert.IsTrue( AreTheSame( res3, norm3 ) ); var res4 = "\t".Split2( "\t" ).ToArray(); var norm4 = "\t".Split( '\t' ); Assert.IsTrue( AreTheSame( res4, norm4 ) ); var res5 = "\t\t".Split2( "\t" ).ToArray(); var norm5 = "\t\t".Split( '\t' ); Assert.IsTrue( AreTheSame( res5, norm5 ) ); var res6 = "a\t".Split2( "\t" ).ToArray(); var norm6 = "a\t".Split( '\t' ); Assert.IsTrue( AreTheSame( res6, norm6 ) ); var res7 = "\ta".Split2( "\t" ).ToArray(); var norm7 = "\ta".Split( '\t' ); Assert.IsTrue( AreTheSame( res7, norm7 ) ); // Works the same as a standard Split string except in // the case where the Splitter string is an empty string var norm8 = test.Split(); var res8 = test.Split2( "" ).ToArray(); Assert.IsFalse( AreTheSame( res8, norm8 ) ); } // Checks whether 2 string arrays are exactly the same, ie. they have // the same length and the same values at each array entry public static bool AreTheSame( string[] stringArray1, string[] stringArray2) { bool areTheSame = (stringArray1.Length == stringArray2.Length); for (int ix = 0; (ix < stringArray1.Length) && areTheSame; ix++) { areTheSame = stringArray1[ix].Equals(stringArray2[ix], StringComparison.CurrentCulture); } return areTheSame; }
No comments:
Post a Comment