LINQ和动态列表类型

本文关键字:类型 列表 动态 LINQ | 更新日期: 2023-09-27 18:19:45

具有类:

public class SignalRounding
{
    public DateTime LastUpdated { get; set; }
    public int Quantity { get; set; }
    public string symbol { get; set; }
    public double price { get; set; }
    public double round { get; set; }
}
public class SignalRoundingView
{
    public DateTime LastUpdated { get; set; }
    public int Quantity { get; set; }
    public string symbol { get; set; }
    public double price { get; set; }
    public double round { get; set; }
}

创建列表

public static List<SignalRounding> SignalR;
SignalR = new List<SignalRounding>();
ListView.ItemsSource = SignalR;
ListView.Items.Refresh();

添加一些具有特定参数的信息

try
{
 var r = SignalR.Where(t => t.LastUpdated >= DateTime.Now.AddMinutes(-10))
 .GroupBy(g => g.symbol)
 .Select(s => new SignalRoundingView()
  {
    LastUpdated = s.Max(x => x.LastUpdated),
    Quantity = s.Count(),
    symbol = s.Key,
    price = s.Single(l => l.LastUpdated == s.Max(x => x.LastUpdated)).price,
    round = s.Single(l => l.LastUpdated == s.Max(x => x.LastUpdated)).round
  })
.OrderByDescending(x => x.LastUpdated)
.ThenByDescending(x => x.Quantity).ToList();
Filter3List.ItemsSource = r;
Filter3List.Items.Refresh();
}
catch (Exception){throw;}

List<SignalRounding> SignalR是动态的——有时会出现错误。描述如下:集合已修改;无法执行枚举操作。

如何修复?

LINQ和动态列表类型

确保不允许一个线程在列表(Linq查询)上迭代,而另一个线程正在添加列表。您可以使用锁来实现这一点。性能会受到影响,因此您需要根据向列表中添加新对象的速度和列表的长度来决定此解决方案是否足够好。

private object myLock = new Object();
void AddToList(SignalR s)
{
    lock(myLock) {
        SignalR.Add(s);
    }
}
void UpdateList() {
    lock(myLock)
    {
        var r = SignalR.Where(...).ToList();
        Filter3List.ItemsSource = r;
        Filter3List.Items.Refresh();
    }
}

您有多个线程访问您的列表,这些线程将抛出异常。使用ConcurrentBag<T>:代替List<T>

public static ConcurrentBag<SignalRounding> SignalR;

注意:它位于System.Collections.Concurrent命名空间中。