DinoMedlem sedan sep. 20011 914 inlägg Skulle behöva hjälp med att skapa en metod som delar upp en sträng i delar, med x antal tecken i varje.
public void btClick_Click(object sender, EventArgs e)
{
string data = "abcdefghijklmn";
string[] col = SplitString(data, 4);
foreach (string s in col)
{
Response.Write(s + "<br/>");
}
}
private string[] SplitString(string s, int size)
{
//Code needed
}
Result:
abcd
efgh
ijkl
mn
Peter SMedlem sedan dec. 20025 483 inlägg Otestat:
private MatchCollection SplitString(string s, int size)
{
if (size > 0)
{
StringBuilder regexBuilder = new StringBuilder("(");
while (size-- > 0)
{
regexBuilder.Append("(?:.)?");
}
regexBuilder.Append(")");
return Regex.Matches(s, regexBuilder.ToString());
}
return null;
}
MatchCollection coll = SplitString(data, 4);
if (coll != null)
{
foreach (Match match in coll)
{
// use match.Value
}
}
Jag hade nog gjort såhär. Man kan antagligen få det mycket snabbare med for satser, men detta är en ganska snabb och enkel lösning.
Ett tips är ju att lägga det som en extension.
Det finns nog snabbare lösningar rent prestandamässigt.
public string[] SplitString(string value, int splitSize)
{
Regex splitRegex = new Regex(string.Format(".{,{0}}", splitSize.ToString());
MatchCollection matches = splitRegex.Matches(stringValue);
string[] stringArray = new string[matches.Count];
for(int i=0; i< matches.Count; i++)
{
stringArray[i] = matches[i].Value;
}
return stringArray;
}
spangoMedlem sedan juni 20008 205 inlägg Eller bara...
public static IEnumerable<string> Chunkify(this string self, int chunkSize)
{
for (int i = 0; i < self.Length; i += chunkSize)
yield return self.Substring(i, Math.Min(chunkSize, self.Length - i));
}
// ...
foreach (string s in "abcdefghiklmn".Chunkify(4)) Console.Writeline(s);
Peter SMedlem sedan dec. 20025 483 inlägg
spango skrev:
Eller bara...
public static IEnumerable<string> Chunkify(this string self, int chunkSize)
{
for (int i = 0; i < self.Length; i += chunkSize)
yield return self.Substring(i, Math.Min(chunkSize, self.Length - i));
}
// ...
foreach (string s in "abcdefghiklmn".Chunkify(4)) Console.Writeline(s);
Vad vackert! Härmed är jag tårögd (y)
Peter S skrev:
Vad vackert! Härmed är jag tårögd (y)
Snygg lösning. Men förstår inte missbruket av Extension metoder i detta fall.
mvh Johan
spangoMedlem sedan juni 20008 205 inlägg Kan man så ska man. ;) Jag överlåter bedömning om huruvida det är en lämplig kandidat för extensions eller inte till användaren.
spango skrev:
Kan man så ska man. ;) Jag överlåter bedömning om huruvida det är en lämplig kandidat för extensions eller inte till användaren.
haha... Mm o man kan använda arv oxå ;-) till allt.. för att det finns där..
hehe... :bire
DinoMedlem sedan sep. 20011 914 inlägg Segern tilldelas spango. Arrangören tackar alla deltagare för dess medverkan till att göra denna fråga till THE MOST BRUTAL QUESTION THIS DAY AND MAYBE EVEN THE FOLLOWING DAY.
spangoMedlem sedan juni 20008 205 inlägg
johannormen skrev:
Mm o man kan använda arv oxå ;-) till allt.. för att det finns där..
Ja, jag tänkte på det till en början, men sen kom jag på att String är ju sealed x( så jag fick nöja mig med det Näst Bästa. (Eller Second Most Brutal Solution för att fortsätta i trådskaparens föredömliga anda (y) )
spango skrev:
Ja, jag tänkte på det till en början, men sen kom jag på att String är ju sealed x( så jag fick nöja mig med det Näst Bästa. (Eller Second Most Brutal Solution för att fortsätta i trådskaparens föredömliga anda (y) )
Inget fel på extensionmetoden så länge du vet att du kommer använda den mer än en gång på andra ställen.
inspiroMedlem sedan sep. 2005673 inlägg Hur implementerar man en extension? Det står att "extension methods måste implementeras i en non generic static class?
CompusaMedlem sedan jan. 20023 327 inlägg inspiro, se exemplet nedan:
class Program
{
static void Main(string[] args)
{
string customerEmailAddress = "test@test.com";
if (customerEmailAddress.IsValidEmailAddress())
{
// Do Something...
}
}
}
public static class Extensions
{
public static bool IsValidEmailAddress(this string s)
{
Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
return regex.IsMatch(s);
}
}
Compusa skrev:
inspiro, se exemplet nedan:
class Program
{
static void Main(string[] args)
{
string customerEmailAddress = "test@test.com";
if (customerEmailAddress.IsValidEmailAddress())
{
// Do Something...
}
}
}
public static class Extensions
{
public static bool IsValidEmailAddress(this string s)
{
Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
return regex.IsMatch(s);
}
}
Här måste jag leka doktor o lägga mig i lite :-/
Gör helst inte på detta sätt för du binder en unik funktion till hela stringtypen. Ex alla string som finns i det scope där denna extensions används kommer helt plötsligt ha en metod som kollar e-mail.
ex. name.IsValidEmail()...
productName.IsValidEmail()...
password.IsValidEmail()...
file.IsValidEmail()...
Detta är att missbruka extensions... Här är ett typiskt fall då man bör undvika extension och lägga dem i en validerator klass istället.
typ:
Validator.IsValidEmail(email)
Detta är en typiskt regel för Singel responsability principle och single responsability rule.
koddotorn har talat ;-)
mvh Johan
CompusaMedlem sedan jan. 20023 327 inlägg Nu googlade jag bara fram ett exempel för att snabbt visa inspiro syntaxen för extensions. Jag var helt enkelt för lat för att skriva ihop något själv. Tanken med exemplet var alltså inte att visa "best practice" gällande hur man bör använda extensions. Ibland får man ta ett exempel för vad det är helt enkelt.
Bra påpekande hur som helst och jag delar din åsikt helt och hållet.
Compusa skrev:
Nu googlade jag bara fram ett exempel för att snabbt visa inspiro syntaxen för extensions. Jag var helt enkelt för lat för att skriva ihop något själv. Tanken med exemplet var alltså inte att visa "best practice" gällande hur man bör använda extensions. Ibland får man ta ett exempel för vad det är helt enkelt.
Bra påpekande hur som helst och jag delar din åsikt helt och hållet.
:-)
Det är oftast det som är så dumt med fel exempel, jag är inte bäst på visa bra exempel alltid heller, problemet är att de som ser dem kan tro man skall göra så...