Die Methode LINQ Join()
mit Nullable<int>
für TKey
überspringt Null-Schlüsselübereinstimmungen. Was fehlt mir in der Dokumentation? Ich weiß, dass ich zu SelectMany()
wechseln kann, ich bin nur neugierig, warum diese Gleichheitsoperation funktioniert wie SQL und nicht wie C# seit so nah wie ich sagen kann, funktioniert die EqualityComparer<int?>.Default
genau so, wie ich es für Null-Werte erwarten würde.LINQ Beitreten für einen Nullable-Schlüssel
http://msdn.microsoft.com/en-us/library/bb534675.aspx
using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
public class dt
{
public int? Id;
public string Data;
}
public class JoinTest
{
public static int Main(string [] args)
{
var a = new List<dt>
{
new dt { Id = null, Data = "null" },
new dt { Id = 1, Data = "1" },
new dt { Id = 2, Data = "2" }
};
var b = new List<dt>
{
new dt { Id = null, Data = "NULL" },
new dt { Id = 2, Data = "two" },
new dt { Id = 3, Data = "three" }
};
//Join with null elements
var c = a.Join(b,
dtA => dtA.Id,
dtB => dtB.Id,
(dtA, dtB) => new { aData = dtA.Data, bData = dtB.Data }).ToList();
// Output:
// 2 two
foreach (var aC in c)
Console.WriteLine(aC.aData + " " + aC.bData);
Console.WriteLine(" ");
//Join with null elements converted to zero
c = a.Join(b,
dtA => dtA.Id.GetValueOrDefault(),
dtB => dtB.Id.GetValueOrDefault(),
(dtA, dtB) => new { aData = dtA.Data, bData = dtB.Data }).ToList();
// Output:
// null NULL
// 2 two
foreach (var aC in c)
Console.WriteLine(aC.aData + " " + aC.bData);
Console.WriteLine(EqualityComparer<int?>.Default.Equals(a[0].Id, b[0].Id));
Console.WriteLine(EqualityComparer<object>.Default.Equals(a[0].Id, b[0].Id));
Console.WriteLine(a[0].Id.Equals(b[0].Id));
return 0;
}
}
Habe ich das irgendwo in der Dokumentation vermisst? – ryancerium
@ryancerium gerade überprüft msdn, sieht aus, als ob dieses Verhalten nicht erwähnt wird. Aber ich suche Quellen mit Reflector und sehe diese Implementierung. –
Das scheint mir eine ziemlich ernste Unterlassung in der Dokumentation zu sein. Danke, dass Sie sich das für mich angesehen haben. – ryancerium