Search code examples
c#json.net

JArray.Contains returns false


Why does JArray.Contains always returns false, what am I doing wrong ?

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

Solution

  • The implementation of Contains rely on IndexOf then IndexOfItem then IndexOfReference which use ReferenceEquals (the code is here).

    Since the calls to Contains implicitly create new JToken references, those references are different and the function return false

    If you call Contains with a reference that is actually in the array, it will 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