簡體   English   中英

JArray.Contains 返回 false

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM