OK OK, je sais que c'est un hack, mais c'était pour un petit projet de manipulation de données et je voulais jouer. ;-)Optimisations du compilateur de types anonymes
J'ai toujours eu l'impression que le compilateur examinerait tous les types anonymes utilisés dans un programme C# et que si les propriétés étaient les mêmes, cela créerait seulement une classe en arrière-plan.
Alors disons que je veux créer un type anonyme de certains jeux de données typées que j'ai:
var smallData1 = new smallData1().GetData().Select(
x => new { Name = x.NAME, x.ADDRESS, City = x.CITY, State = x.STATE,
Zip = x.ZIP, Country = x.COUNTRY, ManagerName = x.MANAGER_NAME,
ManagerID = x.MANAGER_ID });
var smallData2 = new smallData2().GetData().Select(
x => new { x.Name, x.ADDRESS, x.City, x.State, x.Zip, x.Country,
x.ManagerName,x.ManagerID });
Je peux maintenant faire des choses amusantes comme smallData2.Except (smallData1); etc., et tout fonctionne.
Maintenant, si j'ai une plus grande paire de types anonymes:
var bigData1 = new BigAdapter1().GetData().Select(
x => new { x.FirstName, x.LastName, x.Address, x.City, x.State,
x.Zip, x.Country, x.Phone, x.Email, x.Website, x.Custom1, x.Custom2,
x.Custom3, x.Custom4, x.Custom5, x.Custom6, x.Custom7, x.Custom8, x.Custom9,
x.Custom10, x.Custom11, x.Custom12, x.Custom13, x.Custom14, x.Custom15,
x.Custom16, x.Custom17, x.Custom18, x.Custom19, x.Custom20, x.Custom21,
x.Custom22, x.Custom23, x.Custom24, x.Custom25, x.Custom26, x.Custom27,
x.Custom28, x.Custom29});
var bigData2 = new BigAdapter2().GetData().Select(
x => new { x.FirstName, x.LastName, x.Address, x.City, x.State, x.Zip,
x.Country, x.Phone, x.Email, x.Website, x.Custom1, x.Custom2, x.Custom3,
x.Custom4, x.Custom5, x.Custom6, x.Custom7, x.Custom8, x.Custom9, x.Custom10,
x.Custom11, x.Custom12, x.Custom13, x.Custom14, x.Custom15, x.Custom16,
x.Custom17, x.Custom18, x.Custom19, x.Custom20, x.Custom21, x.Custom22,
x.Custom23, x.Custom24, x.Custom25, x.Custom26, x.Custom27,
x.Custom28, x.Custom29});
Maintenant, quand je fais bigData2.Except (bigData1); le compilateur se plaint:
Instance argument: cannot convert from
'System.Data.EnumerableRowCollection<AnonymousType#1>' to
'System.Linq.IQueryable<AnonymousType#2>'
Pourquoi? Trop de propriétés, donc le compilateur décide que ça ne vaut pas la peine d'optimiser?
Merci!
Oui, les adaptateurs retournent des types de données légèrement différents, mais la différence est uniquement le type de jeu de données typé (ils proviennent de bases de données différentes). Toutes les propriétés sont des chaînes, c'est pourquoi j'ai pensé que j'utiliserais simplement un type anonyme et que cela me permettrait de traiter les données comme un type de type au lieu de deux. – Pandincus
OMG O D EST CE DOUBLE? Euh ... d'accord, vous aviez tout à fait raison. L'un des types est en effet différent. Je suppose que c'est ce qui arrive quand vous codez tard dans la nuit: -O – Pandincus