Pertanyaan Bagaimana cara mengumpulkan satu properti dalam daftar objek?


Apakah mungkin untuk membuat metode perluasan untuk mengembalikan satu properti atau bidang dalam daftar objek?

Saat ini saya memiliki banyak fungsi seperti berikut ini.

public static List<int> GetSpeeds(this List<ObjectMotion> motions) {
    List<int> speeds = new List<int>();
    foreach (ObjectMotion motion in motions) {
        speeds.Add(motion.Speed);
    }
    return speeds;
}

Ini adalah "hard coded" dan hanya melayani satu properti dalam satu jenis objek. Ini membosankan dan saya yakin ada cara menggunakan LINQ / Refleksi untuk membuat metode perluasan yang dapat melakukan ini dengan cara yang umum dan dapat digunakan kembali. Sesuatu seperti ini:

public static List<TProp> GetProperties<T, TProp>(this List<T> objects, Property prop){
    List<TProp> props = new List<TProp>();
    foreach (ObjectMotion obj in objects) {
        props.Add(obj.prop??);
    }
    return props;
}

Terlepas dari metode termudah menggunakan LINQ, saya juga mencari metode tercepat. Apakah mungkin untuk menggunakan pembuatan kode (dan pohon ekspresi Lambda) untuk membuat metode seperti itu saat runtime? Saya yakin itu akan lebih cepat daripada menggunakan Refleksi.


5
2018-03-12 13:53


asal


Jawaban:


Anda bisa melakukan:

public static List<TProp> GetProperties<T, TProp>(this IEnumerable<T> seq, Func<T, TProp> selector)
{
    return seq.Select(selector).ToList();
}

dan gunakan seperti:

List<int> speeds = motions.GetProperties(m => m.Speed);

itu dipertanyakan apakah metode ini lebih baik daripada hanya menggunakan Select dan ToList secara langsung.


7
2018-03-12 13:59



Ini, tidak ada refleksi yang dibutuhkan:

List<int> values = motions.Select(m=>m.Speed).ToList();

5
2018-03-12 13:56



A for loop akan menjadi yang tercepat menurut saya, diikuti oleh linq (overhead minimal jika Anda tidak menggunakan penutupan). Saya tidak dapat membayangkan mekanisme lain yang lebih baik dari itu.

Anda bisa mengganti List<int> dengan int[] atau menginisialisasi daftar dengan kapasitas tertentu. Itu mungkin akan melakukan lebih banyak untuk mempercepat kode Anda daripada yang lain (meskipun masih belum banyak).


1
2018-03-12 14:00