JArray.Contains returns 错误

JArray.Contains returns false

为什么JArray.Contains总是returnsfalse,我做错了什么?

var array = JArray.Parse("['abc', 'aaa']");
Console.WriteLine("1: " + array.Contains("abc"));           // false
Console.WriteLine("2: " + array.Contains((JToken)"abc"));   // false

试试这个

var array = JArray.Parse("['abc', 'aaa']");
var data = array.Any(x => x.Value<string>() == "abc");
Console.WriteLine(data);

Contains的实现依赖IndexOf然后IndexOfItem然后IndexOfReference其中使用ReferenceEquals(代码是here)。

由于对 Contains 的调用隐式创建了新的 JToken 引用,这些引用是不同的,并且函数 return false

如果您调用 Contains 时使用实际在数组中的引用,它将 return 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