theo dõi

Gần nhất :

Tags

Thống kê câu hỏi

Chuyên mục : Lập trình
Topic : C#
Hỏi lúc:
Lượt xem: 1,805

Làm thế nào để tôi thực hiện truy vấn LINQ này nhanh hơn?

Nguyễn Ngọc Anh Nguyễn Ngọc Anh
 08  01  00
08 bình chọn hữu ích bởi Nguyễn Thanh Hiếu, Lý Anh Khoa Hoàng Vạn Lý ... (tất cả)

modelData 100.000 thư mục trong danh sách.

Tôi đang làm 2 "select"  với 2 vòng lặp.

Có thể có cấu trúc khác nhau nhưng nó mất một thời gian dài - 10 phút

public class ModelData
{
    public string name;
    public DateTime DT;
    public int real;
    public int trade;
    public int position;
    public int dayPnl;
}

List<ModelData> modelData;

var dates = modelData.Select(x => x.DT.Date).Distinct();
var names = modelData.Select(x => x.name).Distinct();

foreach (var aDate in dates)
{
    var dateRealTrades = modelData.Select(x => x)
                                  .Where(x => x.DT.Date.Equals(aDate) && x.real.Equals(1));

    foreach (var aName in names)
    {
        var namesRealTrades = dateRealTrades.Select(x => x)
                                            .Where(x => x.name.Equals(aName));

        // DO MY PROCESSING
    }
}

Thank all!

1,805 xem 05 theo dõi 08 hữu ích hỏi –

Bạn biết ai đó có thể trả lời câu hỏi này?. Bạn có thể giúp đỡ bằng cách tìm những người giỏi nhất:

user user user user user

Huỳnh Chí Kiên Huỳnh Chí Kiên
 07  00  01
07 bình chọn hữu ích bởi Trần Lập Thành, Trịnh Thiên Giang Dương Ngọc Hoa ... (tất cả)

Tôi tin rằng những gì bạn muốn có thể đạt được với hai truy vấn sử dụng group by. Một để tạo ra một tra cứu theo date và hai để cung cấp cho bạn các items nhóm theo name-date.

var data = modelData.Where(x => x.real.Equals(1))
                    .GroupBy(x => new { x.DT.Date, x.name });
var byDate = modelData.Where(x => x.real.Equals(1))
                      .ToLookup(x => x.DT.Date);

foreach(var item in data)
{
    var aDate = item.Key.Date; 
    var aName = item.Key.name;
    var namesRealTrades = item.ToList();
    var dateRealTrades = byDate[aDate].ToList();

    // DO MY PROCESSING
}

Truy vấn đầu tiên sẽ cung cấp cho bạn các items được phân nhóm theo namedate để lặp qua và lần thứ hai sẽ cung cấp cho bạn một tra cứu để có được tất cả các items liên quan đến một date nhất định. Việc thứ hai sử dụng một tra cứu để biết danh sách trên sẽ được lặp một lần và mang lại cho bạn kết quả danh sách các items của bạn truy nhập nhanh hơn.

Điều này sẽ làm giảm đáng kể số lần bạn lặp qua modelData từ những gì bạn đang có.

1,545 xem 07 hữu ích trả lời –
Hoàng Minh Thái Hoàng Minh Thái
 01  00  01
01 bình chọn hữu ích bởi Dương Thanh Vũ

Một nên chú ý vài điều:

  • Sử dụng ToList() để tính toán một chuỗi mỗi lần, vì vậy bạn có thể giữ nó cho sau này sử dụng.
  • Sử dụng .GroupBy() để tránh tái tìm kiếm modelData cho những thứ đã được bạn tìm thấy.
// Collections của models có Date hoặc Name.
var dates = modelData.GroupBy(x => x.DT.Date);
var names = modelData.GroupBy(x => x.Name);

foreach (var modelsWithDate in dates)
{
   var aDate = modelsWithDate.Key;
   var dateRealTrades = modelsWithDate.Where(x => x.real == 1).ToList();

   foreach (var modelsWithName in names)
   {
       var aName = modelsWithName.Key;
       var namesRealTrades = modelsWithName.ToList();

       // DO MY PROCESSING
   }
}
1,527 xem 01 hữu ích trả lời –
Ngô Xuân Bách Ngô Xuân Bách
 01  00  01
01 bình chọn hữu ích bởi Nguyễn Ngọc Anh

Bạn có thể viết lại cho vòng lặp của bạn như thế này:

foreach (var namesRealTrades in names.Select(aName => dateRealTrades.Where(x => x.name.Equals(aName))))
{
   //DO STUFF
}

Tùy thuộc vào dữ liệu của bạn, có thể giảm số lượng các truy vấn bạn phải làm

1,552 xem 01 hữu ích trả lời –