大家好,这是我第一个问题,所以请放轻松我。
我正在使用Lambda / LINQ,同时构建自己很少的实用方法。
第一种方法采用字符串,
"AdnanRazaBhatti"
并将其分解为,
"Adnan Raza Bhatti"
第二种方法采用类似第一种方法的字符串,也需要
out String[] brokenResults
并像第一个方法一样返回断开的字符串,并按如下方式填充brokenResults数组。
"Adnan" "Raza" "Bhatti"
一个。您能否建议如何提高这些方法的效率?
B中。当我尝试使用StringBuilder时,它告诉我扩展方法,例如,Where,Select对于StringBuilder类不存在,为什么会这样?尽管索引器在StringBuilder上工作以获取StringBuilder s = new StrinBuilder(“Dang”)等字符; char c = s [0];这里char将是D;
方法1:
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;
}
方法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;
}
我打算使用这些实用程序方法来分解从数据库中获取的表列名。
例如,如果列名是“BooksId”,我将使用其中一种方法将其分解为“Books Id”,我知道还有其他方法或重命名列名,如设计窗口或[数据集]。[ tableName] .HeadersRow.Cells [0] .Text =“Books Id”但我也打算将来在其他地方使用这种方法。
谢谢
答案 0 :(得分:4)
您可以使用以下扩展方法根据大写字母拆分字符串:
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
答案 1 :(得分:2)
检查此代码
public static string SeperateCamelCase(this string value)
{
return Regex.Replace(value, "((?<=[a-z])[A-Z]|[A-Z](?=[a-z]))", " $1");
}
希望这个答案可以帮到你。如果你找到解决方案,请标记我的答案并指出它。
答案 2 :(得分:1)
在我看来,正规表达是最佳选择。
我认为[A-Z] [a-z] +可能是一个很好的开始。
答案 3 :(得分:1)
更新版本。字符串构建器用于降低内存利用率。
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;
}