Outline
問題範例
Accumul.Accum("abcd"); // "A-Bb-Ccc-Dddd"
Accumul.Accum("RqaEzty"); // "R-Qq-Aaa-Eeee-Zzzzz-Tttttt-Yyyyyyy"
Accumul.Accum("cwAt"); // "C-Ww-Aaa-Tttt"
我的寫法
using System;
public class Accumul
{
// Version 1
public static String Accum1(string s)
{
string sOut = "";
for(int i=0;i<s.Length;i++){
char c = s[i]; // useless condition
if(char.IsLower(s[i]) == true){
c = char.ToUpper(s[i]);
}
sOut += c;
for(int j=0;j<i;j++){
sOut += char.ToLower(s[i]);
}
if(i!=s.Length-1){
sOut += "-";
}
}
return sOut;
}
// Version 2
public static String Accum2(string s)
{
string sOut = "";
for(int i=0;i<s.Length;i++){
sOut += char.ToUpper(s[i]);
for(int j=0;j<i;j++){
sOut += char.ToLower(s[i]);
}
if(i!=s.Length-1){
sOut += "-";
}
}
return sOut;
}
}
}
他人解法賞析
using System;
using System.Linq;
public class Accumul
{
public static String Accum(string s)
{
return string.Join("-",s.Select((x,i)=>char.ToUpper(x)+new string(char.ToLower(x),i)));
}
}
比較差異
重點差異在 LINQ 可以節省很多時間,還有 lambda function 可以很簡短完成任務。
LINQ
全名是 Language Integrated Query ,目的是希望 C# 能夠用 query 的方式處理資料(不管是SQL database,XML或其他Web),直接看範例就能懂。
class LINQQueryExpressions
{
static void Main()
{
// Specify the data source.
int[] scores = new int[] { 97, 92, 81, 60 };
// Define the query expression.
IEnumerable<int> scoreQuery =
from score in scores
where score > 80
select score;
// Execute the query.
foreach (int i in scoreQuery)
{
Console.Write(i + " ");
}
}
}
// Output: 97 92 81
String.Join
格式為: String.Join (String, String[]) 基本上和 python 的 join 是一樣,將字串陣列用指定至串從中間串接起來。 String.Join 方法
String.Select 與 lambda 運算式
String.Select 是將 Enumerable 中每一個元素都執行過一次 lambda function。 字串string是有繼承 Enumerable ,因此可以被 iterate 過
簡單範例為下
IEnumerable<int> squares =
Enumerable.Range(1, 10).Select(x => x * x);
foreach (int num in squares)
{
Console.WriteLine(num);
}
/*
This code produces the following output:
1
4
9
16
25
36
49
64
81
100
*/
他人解法中,這部分
(x,i)=>char.ToUpper(x)+new string(char.ToLower(x),i)
是使用 Lambda 運算式。格式為 (input-parameters) => { statement; } 是指將左邊傳入的參數,右邊是函式的運算 搭配 Linq 的 Select 可以使用 iterate value 和 index,因此這邊 x 是 string 中的 char,i 是 index。