[英]C# Iterate through string with Linq .Select()
為什么我不能像上面的示例那樣遍歷字符串並將字母(字符)添加到 HashSet。
我試圖執行這部分代碼,但 HashSet 是空的。 `
HashSet<char> chars2 = new HashSet<char>();
myString.Select(l => chars2.Add(l));
`
延期執行! 無需評價Select
如果您將ToList()
添加到末尾,它將執行您的 lambda 並添加項目。
您也可以將其更改為ForEach
知道這一點,請注意,如果您不對它執行ToList()
並迭代您的集合,它將一次又一次地執行它,因此如果您的 Select 運行成本很高,請確保運行一次。
我不確定“上面的示例”是什么,但您使用的 LINQ 不正確。 不應使用Select
方法來產生副作用。 chars2.Add()
會產生副作用。
此外,如果不需要,大多數 Linq 方法不會執行。 這稱為“延遲執行”。
相反,使用 foreach,它旨在在循環元素時產生副作用。
var myString = "abcd";
HashSet<char> chars2 = new HashSet<char>();
foreach (var chr in myString)
{
chars2.Add(chr);
}
還有更直接的方法可以從特定的字符串創建 hash 集
myString.ToHashSet()
new HashSet<char>(myString)
Select
是一個 LINQ 方法。 大多數 LINQ 方法是中間表達式,不使用集合。 您必須調用ToList
或ForEach
等終端操作才能實際“執行”查詢。
但請注意,使用 Select/ForEach 添加到集合有點奇怪:您正在使用函數式方法來執行副作用(本質上是非函數式的)。
相反,如果在您的 .NET 版本中可用,請直接使用擴展方法ToHashSet()
:
HashSet<char> chars2 = myString.ToHashSet();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.