我正在嘗試使用 Linq 標準方法計算給定文本中括號的數量。這是我到目前為止寫的代碼。
using System;
using System.Linq;
namespace Exercises
{
class BracketExercise
{
static void Main(string[] args)
{
string bracketlist = "a(werawq4rqdcds()()()((((()DAs3";
string value = "(";
//string value2 = ")";
bool result = bracketlist.Contains(value);
Console.WriteLine($"Does string contain specified substring? {result}");
if (result == true)
{
int freq = bracketlist.Count(f => (f == value));
Console.WriteLine(freq);
}
}
}
}
我錯過了什么嗎?這篇文章給了我編譯器錯誤 CS0019,運算子“運算子”不能應用于“字符”和“字串”型別的運算元。我嘗試將“Value”更改為 var 型別,但這也沒有用。ch
uj5u.com熱心網友回復:
使用 LINQ 時,將 astring視為 anIEnumerable<char>這意味著在以下代碼中:
int freq = bracketlist.Count(f => (f == value));
f是型別char,不是string。由于value是 type string,您的代碼正在嘗試執行char == string,這是錯誤的根源。
在這種情況下,我建議您將您value的也更改為char:
char value = '(';
注意不同的'引號。"A"是一個string,'A'是一個char。您使用的引號對編譯器很重要。
uj5u.com熱心網友回復:
在行int freq = bracketlist.Count(f => (f == value));f 是 char 型別(因為字串上的列舉適用于 char)。您正在將其與value字串型別的 進行比較。更改string value = "(";為char value = '(';。請注意用于宣告 char 的單引號(與使用雙引號相反,它宣告一個字串)。
uj5u.com熱心網友回復:
試試下面的代碼。
string bracketlist = "a(werawq4rqdcds()()()((((()DAs3";
Char value = '('; // replace string char
bool result = bracketlist.Contains(value);
Console.WriteLine($"Does string contain specified substring? {result}");
if (result == true)
{
int freq = bracketlist.Count(f => (f == value));
Console.WriteLine(freq);
}
uj5u.com熱心網友回復:
Flater 的回答解決了您的主要抱怨,但我確實想討論一下:
我嘗試將“值”更改為 var 型別
沒有var 型別;var 你是說“允許編譯器決定型別”。然后編譯器將查看右側的型別并根據該型別=做出決定
在右手邊,你有"("- 這是一個字串;沒有什么使它不是一個字串,所以無論你是寫string value還是寫,你最終都會在同一個地方var value
現在你知道你可以寫:
var v = '(';
那v將是一個char,因為'('是一個字符;
其他事情也會導致字符:
var v = "("[0];
那是一個被 int 索引的字串,這是一個導致 char 的操作。在這種情況下,編譯器還會推斷char. v這并不是說你會那樣做 - 這只是為了演示v最終編譯器確定右手操作的最終輸出型別是
通常,我們的目標是var在很明顯另一側的型別是什么時使用,或者如果它是可怕的東西,例如包含其他資料并具有 where 子句等的 LINQ 查詢的輸出,并且我們不想輸入IIncludableQueryableSomethingThatsReallyLongAndDoesntMatter v = ...
有時你應該避免使用 var 如果它使代碼更難閱讀:
//method name is poor; doesn't make it obvious what it does, or returns
//variable name is poor too; we'll have to rely on intellisense lots here
var v = DoProcess();
有時您應該避免使用 var,因為它會使生活變得艱難。回圈遍歷未實作的舊集合IEnumerable<T>就是一個很好的例子:
foreach(var row in someDataTable.Rows)
row這里最終會輸入為object,這使用起來很麻煩。發生這種情況是因為.Rows它是一個 DataRowCollection 并且它的列舉器聲稱它回傳一個object- 它實際上是一個 DataRow 但它被包裹在一個物件中。如果您不使用foreach,將為您做演員:var
foreach(DataRow row in someDataTable.Rows)
這比var'ing 和必須強制轉換更干凈:
foreach(var row in someDataTable.Rows.Cast<DataRow>())
..
//or
foreach(var row in someDataTable.Rows){
var actualRow = (DataRow)row;
..
}
uj5u.com熱心網友回復:
您不需要使用 Contains 方法檢查字串中是否存在字符。即使沒有您正在搜索的字符的實體,計數也會為您提供有效的結果。PF 最簡單的實作。
string bracketlist = "a(werawq4rqdcds()()()((((()DAs3";
char charToFind = '(';
int bCount = bracketList.Count(x => x == charToFind);
請記住,字串是一個字符陣列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/428909.html
下一篇:如何將變數傳遞給謂詞運算式?
