如何使这两种方法更有效
本文关键字:有效 方法 两种 何使这 | 更新日期: 2023-09-27 18:09:02
大家好,这是我在SO上的第一个问题,所以请对我宽容一点。
我正在玩Lambda/LINQ,同时构建自己的几个实用程序方法。
-
第一个方法接受像
这样的字符串"AdnanRazaBhatti"
,然后像
一样分开"Adnan Raza Bhatti"
-
第二个方法像第一个方法一样接受字符串,也接受
out String[] brokenResults
并像第一个方法一样返回破碎的字符串,并像下面那样填充破碎的results数组。
"Adnan" "Raza" "Bhatti"
。你能建议一下如何使这些方法更有效吗?
B。当我尝试使用StringBuilder它告诉我扩展方法,如,在哪里,选择不存在StringBuilder类,为什么这样?虽然indexer在StringBuilder上工作以获得StringBuilder s = new StringBuilder ("Dang");c = s[0];这里char将是D;
<标题> 代码方法一:
public static string SplitCapital( string source )
{
string result = "";
int i = 0;
//Separate all the Capital Letter
var charUpper = source.Where( x => char.IsUpper( x ) ).ToArray<char>( );
//If there is only one Capital letter then it is already atomic.
if ( charUpper.Count( ) > 1 ) {
var strLower = source.Split( charUpper );
foreach ( string s in strLower )
if ( i < strLower.Count( ) - 1 && !String.IsNullOrEmpty( s ) )
result += charUpper.ElementAt( i++ ) + s + " ";
return result;
}
return source;
}
方法二:
public static string SplitCapital( string source, out string[] brokenResults )
{
string result = "";
int i = 0;
var strUpper = source.Where( x => char.IsUpper( x ) ).ToArray<char>( );
if ( strUpper.Count( ) > 1 ) {
var strLower = source.Split( strUpper );
brokenResults = (
from s in strLower
where i < strLower.Count( ) - 1 && !String.IsNullOrEmpty( s )
select result = strUpper.ElementAt( i++ ) + s + " " ).ToArray( );
result = "";
foreach ( string s in brokenResults )
result += s;
return result;
}
else { brokenResults = new string[] { source }; }
return source;
}
<标题>注意:我计划使用这些实用工具方法来分解我从数据库中获得的表列名。
例如,如果列名是"BooksId",我将使用其中一种方法将其分解为"BooksId"编程,我知道还有其他方法或重命名列名,如在设计窗口或[dataset].[tableName]. headersrow . cells[0]。Text = "Books Id",但我也计划在将来的其他地方使用这个方法。
谢谢
标题>标题>标题>您可以使用以下扩展方法根据大写字母拆分字符串:
public static string Wordify(this string camelCaseWord)
{
/* CamelCaseWord will become Camel Case Word,
if the word is all upper, just return it*/
if (!Regex.IsMatch(camelCaseWord, "[a-z]"))
return camelCaseWord;
return string.Join(" ", Regex.Split(camelCaseWord, @"(?<!^)(?=[A-Z])"));
}
要拆分字符串数组中的字符串,可以这样使用:
public static string[] SplitOnVal(this string text,string value)
{
return text.Split(new[] { value }, StringSplitOptions.None);
}
如果我们考虑你的例子,代码将如下:
string strTest = "AdnanRazaBhatti";
var capitalCase = strTest.Wordify(); //Adnan Raza Bhatti
var brokenResults = capitalCase.SplitOnVal(" "); //seperate by a blank value in an array
检查此代码
public static string SeperateCamelCase(this string value)
{
return Regex.Replace(value, "((?<=[a-z])[A-Z]|[A-Z](?=[a-z]))", " $1");
}
希望这个答案对你有所帮助。如果你找到了答案,请标记我的答案并指出来。
在我看来正则表达式是可行的。
我想从[a-z] [a-z]+开始可能比较好。
更新版本。字符串生成器用于减少内存占用。
string SplitCapital(string str)
{
//Search all capital letters and store indexes
var indexes = str
.Select((c, i) => new { c = c, i = i }) // Select information about char and position
.Where(c => Char.IsUpper(c.c)) // Get only capital chars
.Select(cl => cl.i); // Get indexes of capital chars
// If no indexes found or if indicies count equal to the source string length then return source string
if (!indexes.Any() || indexes.Count() == str.Length)
{
return str;
}
// Create string builder from the source string
var sb = new StringBuilder(str);
// Reverse indexes and remove 0 if necessary
foreach (var index in indexes.Reverse().Where(i => i != 0))
{
// Insert spaces before capital letter
sb.Insert(index, ' ');
}
return sb.ToString();
}
string SplitCapital(string str, out string[] parts)
{
var splitted = SplitCapital(str);
parts = splitted.Split(new[] { ' ' }, StringSplitOptions.None);
return splitted;
}