Pilih properti DateTime yang berbeda dari string Daftar‹IDictionary‹,objek›› menggunakan LINQ

Saya memiliki metode yang mengembalikan List<IDictionary<string,object>>.

Objek untuk kamus dibuat menggunakan ExpandoObject dan kemudian ditambahkan ke daftar dengan loop foreach. Berikut adalah contoh objek tersebut:

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";

Dari apa yang dikembalikan oleh metode ini, saya perlu memilih nilai berbeda dari "Properti DateTime 1", tetapi hanya untuk bagian tanggal saja. Jadi, saya mencoba melakukan hal berikut:

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

Namun dikatakan bahwa tidak ada metode seperti ToShortDateString():

IEnumerable' tidak berisi definisi untuk 'ToShortDateString' dan tidak ada metode ekstensi 'ToShortDateString' yang menerima argumen pertama bertipe 'IEnumerable' yang dapat ditemukan.

Mengapa object dalam kamus tidak dikonversi ke tipe DateTime secara otomatis ketika properti diberi nilai DateTime? Saat saya menggunakan dynamic di mana saja, bukan object, semuanya berfungsi dengan baik.

Bagaimana cara membuatnya berfungsi saat menggunakan object?


person YMM    schedule 25.11.2016    source sumber


Jawaban (1)


Metode Anda mengembalikan List<IDictionary<string,object>>, jadi ketika Anda mengakses item dalam Dictionary, kompiler akan memperlakukannya sebagai object sehingga akan mendeteksi bahwa tidak ada metode ToShortDateString yang ditentukan di dalamnya.

Jika metode Anda mengembalikan List<dynamic> dan Anda mengakses elemen sebagai dynamic, kompiler tidak akan memeriksa apakah ToShortDateString ada atau tidak, sehingga Anda tidak akan mendapatkan kesalahan.

Jika Anda tahu s["DateTime Property 1"] adalah DateTime, Anda cukup mentransmisikannya

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

Alternatifnya, Anda dapat memanggil ToString lalu menguraikan hasilnya

DateTime.Parse(s["DateTime Property 1"].ToString()).ToShortDateString();
person KMoussa    schedule 25.11.2016
comment
Ya, Properti DateTime 1 bertipe DateTime. Ini dihitung dengan DateTimeOffset.Parse(JTokenValue.ToString()).DateTime dalam metode yang disebutkan di atas. Mencoba mentransmisikan DateTime tidak membantu: kesalahan tentang metode ToShortDateString() yang hilang masih ada. Memanggil ToString() sebelum ToShortDateString() tidak berfungsi karena ToShortDateString() mengharapkan DateTime sebagai argumen, bukan string (kesalahan tentang hal itu muncul). - person YMM; 25.11.2016
comment
dapatkah Anda memasukkan kode yang Anda gunakan untuk mentransmisikan ke DateTime? - person KMoussa; 25.11.2016
comment
Anda kehilangan tanda kurung, var unique = GetData().Select(s => ((DateTime)s["DateTime Property 1"]).ToShortDateString()).Distinct(); seharusnya berfungsi - person KMoussa; 25.11.2016