เลือกคุณสมบัติ DateTime ที่แตกต่างจาก List‹IDictionary‹string,object›› โดยใช้ LINQ

ฉันมีวิธีการที่ส่งคืน List<IDictionary<string,object>>

ออบเจ็กต์สำหรับพจนานุกรมถูกสร้างขึ้นโดยใช้ ExpandoObject จากนั้นเพิ่มลงในรายการด้วยการวนซ้ำ foreach นี่คือตัวอย่างของวัตถุดังกล่าว:

var dataItem = new ExpandoObject() as IDictionary<string, object>;
dataItem["String Property 1"] = "String Value 1";
dataItem["String Property 2"] = "String Value 2";
dataItem["DateTime Property 1"] = "DateTime Value 1";
dataItem["DateTime Property 2"] = "DateTime Value 2";

จากสิ่งที่วิธีการส่งคืน ฉันต้องเลือกค่าที่แตกต่างกันของ "คุณสมบัติ DateTime 1" แต่สำหรับส่วนของวันที่เท่านั้น ดังนั้นฉันจึงพยายามทำสิ่งต่อไปนี้:

var unique = GetData().Select(s => s["DateTime Property 1"].ToShortDateString()).Distinct();

แต่มันบอกว่าไม่มีวิธีการเช่น ToShortDateString():

IEnumerable' ไม่มีคำจำกัดความสำหรับ 'ToShortDateString' และไม่มีวิธีการขยาย 'ToShortDateString' ที่ยอมรับอาร์กิวเมนต์แรกของประเภท 'IEnumerable'

เหตุใด object ในพจนานุกรมจึงไม่แปลงเป็นประเภท DateTime โดยอัตโนมัติเมื่อคุณสมบัติถูกกำหนดค่า DateTime เมื่อฉันใช้ dynamic ทุกที่แทนที่จะเป็น object ทุกอย่างทำงานได้ดี

ฉันจะทำให้มันทำงานได้อย่างไรเมื่อใช้ object


person YMM    schedule 25.11.2016    source แหล่งที่มา


คำตอบ (1)


เมธอดของคุณส่งคืน List<IDictionary<string,object>> ดังนั้นเมื่อคุณเข้าถึงไอเท็มภายใน Dictionary คอมไพเลอร์จะถือว่ามันเป็น object และจะตรวจพบว่าไม่มีเมธอด ToShortDateString กำหนดไว้

หากวิธีการของคุณส่งคืน List<dynamic> แทน และคุณเข้าถึงองค์ประกอบเป็น dynamic คอมไพลเลอร์จะไม่ตรวจสอบว่ามี ToShortDateString อยู่หรือไม่ ดังนั้นคุณจะไม่ได้รับข้อผิดพลาด

หากคุณ รู้ s["DateTime Property 1"] คือ DateTime คุณก็สามารถแคสต์ได้เลย

((DateTime)s["DateTime Property 1"]).ToShortDateString();

หรือคุณสามารถโทร ToString แล้วแยกวิเคราะห์ผลลัพธ์

DateTime.Parse(s["DateTime Property 1"].ToString()).ToShortDateString();
person KMoussa    schedule 25.11.2016
comment
ใช่ คุณสมบัติ DateTime 1 เป็นประเภท DateTime คำนวณโดย DateTimeOffset.Parse(JTokenValue.ToString()).DateTime ภายในวิธีการที่กล่าวถึงข้างต้น การพยายามส่ง DateTime ไม่ได้ช่วยอะไร: ข้อผิดพลาดเกี่ยวกับวิธีการ ToShortDateString() ที่หายไปยังคงอยู่ การเรียก ToString() ก่อน ToShortDateString() ไม่ทำงานเนื่องจาก ToShortDateString() คาดว่า DateTime จะเป็นอาร์กิวเมนต์ ไม่ใช่ string (ข้อผิดพลาดเกี่ยวกับสิ่งนั้นปรากฏขึ้น) - person YMM; 25.11.2016
comment
คุณสามารถรวมรหัสที่คุณใช้ส่งไปที่ DateTime ได้ไหม - person KMoussa; 25.11.2016
comment
คุณไม่มีวงเล็บเหลี่ยม var unique = GetData().Select(s => ((DateTime)s["DateTime Property 1"]).ToShortDateString()).Distinct(); น่าจะใช้ได้ - person KMoussa; 25.11.2016