[英]JArray.Contains returns false
為什么JArray.Contains
總是返回false
,我做錯了什么?
var array = JArray.Parse("['abc', 'aaa']");
Console.WriteLine("1: " + array.Contains("abc")); // false
Console.WriteLine("2: " + array.Contains((JToken)"abc")); // false
Contains
的實現依賴於IndexOf
然后IndexOfItem
然后IndexOfReference
使用ReferenceEquals
(代碼在這里)。
由於對Contains
的調用會隱式創建新的JToken
引用,因此這些引用是不同的,並且函數返回false
如果您使用實際在數組中的引用調用Contains
,它將返回true
:
var array = JArray.Parse("['abc', 'aaa']");
var first = array[0];
Console.WriteLine("1: " + array.Contains("abc")); // false
Console.WriteLine("2: " + array.Contains((JToken)"abc")); // false
Console.WriteLine("3: " + array.Contains(first)); // true
正如@Orace 出色地推斷的那樣,通過引用進行比較否定了.Contains
的有用性。 但是,我相信您的問題背后是希望在陣列上實際執行包含。 我的解決方案很丑陋,但我采取了額外的步驟將JArray
轉換為List<string>
,如下所示:
var tmparray = JArray.Parse("['abc', 'aaa']");
var array = tmparray.ToObject<List<string>>();
if (array.Contains("aaa"))
{
...
}
嘗試這個
var array = JArray.Parse("['abc', 'aaa']");
var data = array.Any(x => x.Value<string>() == "abc");
Console.WriteLine(data);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.