OK OK, ich weiß, das ist ein Hack, aber das war für ein winziges Datenmanipulationsprojekt, und ich wollte herumspielen. ;-)Compiler-Optimierungen von anonymen Typen
Ich hatte immer den Eindruck, dass der Compiler alle anonymen Typen untersuchen würde, die in einem C# -Programm verwendet werden, und wenn die Eigenschaften identisch wären, würde nur eine Klasse hinter den Kulissen entstehen.
Also lassen Sie uns sagen, ich will einen anonymen Typ aus einigen typisierten Datensätzen erstellen, die ich habe:
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 });
ich jetzt tun können Spaß Dinge wie smallData2.Except (smallData1); usw., und alles funktioniert.
Nun, was ist, wenn ich ein größeres Paar anonyme Typen haben:
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});
Wenn ich jetzt tun bigData2.Except (bigData1); der Compiler beschwert sich:
Instance argument: cannot convert from
'System.Data.EnumerableRowCollection<AnonymousType#1>' to
'System.Linq.IQueryable<AnonymousType#2>'
Warum? Zu viele Eigenschaften, also entscheidet der Compiler, dass es sich nicht lohnt zu optimieren?
Danke!
Yup, die Adapter geben etwas unterschiedliche Datentypen zurück, aber der Unterschied ist nur die Art des typisierten Datasets (sie stammen aus verschiedenen Datenbanken). Alle Eigenschaften sind Zeichenfolgen, weshalb ich dachte, ich würde nur einen anonymen Typ verwenden, und das würde mich die Daten als EINE Art von Typ statt zwei behandeln lassen. – Pandincus
OMG WO DAS DOPPELTE KOMMEN VON. Ähm ... okay, du hattest vollkommen recht. Einer der Typen ist tatsächlich anders. Ich schätze, das passiert, wenn du spät nachts kommst: -O – Pandincus