我正在做一個專案,我試圖將蛇形大小寫字串轉換為駝色大小寫,但是當我運行我的代碼時 CS0029 被拋出。我不知道為什么會這樣。
using System;
using System.Linq;
public class Kata
{
public static string ToCamelCase(string str)
{
string[] strSplit = str.Split(new char[] { '-', '_' });
// this query is throwing an error
int firstWordIndex = from s in strSplit
where s != "-" || s != "_"
select Array.IndexOf(strSplit, s);
string firstWord = strSplit[firstWordIndex];
var camelCase = from s in strSplit
where Array.IndexOf(strSplit, s) != firstWordIndex
select s.Replace(s[0], Char.ToUpper(s[0]));
return string.Concat(firstWord, string.Join("", camelCase));
}
}
uj5u.com熱心網友回復:
你不能這樣做:
int firstWordIndex = from s in strSplit
where s != "-" || s != "_"
select Array.IndexOf(strSplit, s);
當你從一個可列舉的事物中選擇(例如像 Split 這樣的陣列給你),你會得到另一個可列舉的事物,即使你放置了一個 where 子句來確保新的可列舉事物只有一個元素
var array = new[]{ "a","b","c"}
array.Where(x => x == "a").Select(..) //returns you an "array" with only one element
如果你只想要一個可列舉的東西,看看像 First()
int firstWordIndex = (
from s in strSplit
where s != "-" || s != "_"
select Array.IndexOf(strSplit, s)
)
.First();
First()(和它的伙伴FirstOrDefault,Single[OrDefault], Last[OrDefault])只會給你T一個IEnumerable<T>。他們也接受您可以使用的 lambda 而不是 Where(看起來像Array.IndexOf(strSplit, strSplit.First(s => s != "-" || s != "_"))
還想指出,這s != "-" || s != "_"對于世界上的每根弦來說都是正確的,因為"-" != "_"- 作為人類,您可能會說“從這個盒子中取出每個不是紅色或藍色的球”,但這意味著not(red or blue),它等價于(not red) AND (not blue)。
“非紅色或非藍色”總是正確的,因為紅球不是藍色,藍球也不是紅色,綠球也不是紅色(C# 不會費心檢查綠球是否為藍色:D )
常見陷阱;當心它
我本來會更深入地修復您的代碼,但就其價值而言,如果我正在撰寫駱駝套路,我可能根本不會使用 LINQ,因為它很有可能成為一個非常復雜、低性能的問題;即使在您擁有的代碼中,您也可以拆分,然后回圈(LINQ 在內部進行大量回圈)以查找任何不是 X 的字符,然后再次回圈(Array IndexOf)以查找該字符的索引。切換到方法語法將是一個輕微的優化,因為Select((element, index) => index)可用于回傳字符的索引而無需再次回圈,但是..
我可能會降低整個事情,將它變成一個字符陣列,回圈它,如果前一個字符是 Char.IsPunctuation/IsWhitespace 而當前字符不是,我會 Char.ToUpper 否則 Char.ToLower 它,然后洗掉空格.. 如果它們是長字串,我會使用 stringbuilder 而不是在其中插入空格。請參閱https://docs.microsoft.com/en-us/dotnet/api/system.char.ispunctuation?view=net-5.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/318822.html
標籤:C#
下一篇:在Webforms之間發送變數
