C# 如何使这两种方法更有效
嗨,伙计们,这是我的第一个问题,所以请对我放松点 我正在使用Lambda/LINQ,同时为自己构建一些实用方法C# 如何使这两种方法更有效,c#,asp.net,linq,stringbuilder,C#,Asp.net,Linq,Stringbuilder,嗨,伙计们,这是我的第一个问题,所以请对我放松点 我正在使用Lambda/LINQ,同时为自己构建一些实用方法 第一个方法采用字符串形式 "AdnanRazaBhatti" 然后把它分解成 "Adnan Raza Bhatti" 第二个方法采用与第一个方法类似的字符串 out String[] brokenResults 并像第一个方法一样返回断开的字符串,并按如下所示填充brokenResults数组 "Adnan" "Raza" "Bhatti" 问题: 你能建议如何使这
"AdnanRazaBhatti"
然后把它分解成
"Adnan Raza Bhatti"
out String[] brokenResults
并像第一个方法一样返回断开的字符串,并按如下所示填充brokenResults数组
"Adnan" "Raza" "Bhatti"
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;
}
公共静态字符串拆分资本(字符串源)
{
字符串结果=”;
int i=0;
//将所有大写字母分开
var charUpper=source.Where(x=>char.IsUpper(x)).ToArray();
//如果只有一个大写字母,那么它已经是原子的了。
if(charUpper.Count()>1){
var strLower=源分割(charUpper);
foreach(strLower中的字符串s)
如果(i
方法2:
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;
}
publicstaticstringsplitcapital(字符串源,out string[]brokenResults)
{
字符串结果=”;
int i=0;
var strUpper=source.Where(x=>char.IsUpper(x)).ToArray();
if(strUpper.Count()>1){
var strLower=源分割(strUpper);
经纪结果=(
从strLower的s
其中i
注:
我计划使用这些实用程序方法来分解从数据库中获取的表列名
例如,如果列名为“BooksId”,我将以编程方式使用其中一种方法作为“BooksId”来分解列名,我知道还有其他方法或重命名列名,如在设计窗口或[dataset].[tableName].HeaderRow.Cells[0].Text=“Books Id”,但我也计划将来在其他地方使用此方法
谢谢在我看来,正则表达式就是最好的选择
我认为[A-Z][A-Z]+可能是一个不错的开始。您可以使用以下扩展方法根据大写字母拆分字符串:
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])"));
}
如果我们以您为例,代码如下:
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");
}
公共静态字符串分隔CAMELCASE(此字符串值)
{
返回Regex.Replace(值“”((?更新版本)。字符串生成器用于降低内存利用率
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;
}
这可能更适合代码复查堆栈交换。仍然有一些打字错误,Wordify
缺少()
和CapitalCase
应该是CapitalCase
@Davy8更新了答案。感谢您的帮助:D@reggie您应该尽可能编译正则表达式以提高性能,例如.private static readonly Regex SomeRegEx=new Regex@“(?)?
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;
}