【问题标题】:List Type update列表类型更新
【发布时间】:2016-01-19 11:55:44
【问题描述】:

上课

public class SignalRounding
    {
        public DateTime timee { 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();

添加一些信息

SignalR.Insert(0, new SignalRounding()
                {
                    timee = DateTime.Now,
                    symbol = symbol,
                    price = price,
                    round = round
                });

再次更新

ListView.Items.Refresh();

现在在我的 ListView 中显示 List,但我希望显示过去 10 分钟内某个符号的行数,而不是时间。最后添加的满足条件的应该是listview中的第一个。

【问题讨论】:

  • 这个问题读起来很糟糕。我不太确定你在问什么
  • 您是否尝试通过减少 timee 来订购 ListView?
  • @Jonesopolis 我想显示某个值的最后 10 分钟的行数
  • @Carl 对我来说重要的是只显示某个值的最后 10 分钟以及最后 10 分钟的行数
  • 你还在打电话ListView.Items.Refresh()吗?正如@DrewJordan 所提到的,不要将您的对象/字段/属性命名为与现有类相同。线程可能有问题。我相信您对 ListView 的操作必须在 GUI 线程中运行,而不是在后台线程中运行。参见例如stackoverflow.com/a/2092036/1913277

标签: c# list class listview arraylist


【解决方案1】:

认为这就是您要查找的内容...这将接收您的 SignalR 对象列表,过滤任何超过 10 分钟的对象,按符号分组,然后返回列表聚合按时间排序,然后按数量排序。

这假设您有一个名为 lv 的 ListView(请,不要将对象命名为与其类相同)。

注意:我添加了对Thread.Sleep() 的调用,只是为了在此示例中返回一些不同的时间戳;否则显然不应该在您的代码中。

public partial class MainWindow : Window
    {
        public static List<SignalRounding> SignalR;

        public MainWindow()
        {
            InitializeComponent();
            SignalR = new List<SignalRounding>();

            var r = SignalR.Where(t => t.time >= DateTime.Now.AddMinutes(-10))
            .GroupBy(g => g.symbol)
            .Select(s => new
            {
                Symbol = s.Key,
                Quantity = s.Count(),
                LastUpdated = s.Max(x => x.time),
                Price = s.Single(l => l.time == s.Max(x => x.time)).price,
                Round = s.Single(l => l.time == s.Max(x => x.time)).round
            })
            .OrderByDescending(x => x.LastUpdated)
            .ThenByDescending(x => x.Quantity);

            addStuff();

            lv.ItemsSource = r;
        }

        private void addStuff()
        {
            for (int i = 0; i < 15; i++)
            {
                SignalR.Insert(0, new SignalRounding()
                {
                    time = DateTime.Now,
                    symbol = i % 10 == 0 ? "second" : i % 5 == 0 ? "third" : "first",
                    price = 0.25 * i,
                    round = i
                });
                Thread.Sleep(500);
            }
        }
    }


    public class SignalRounding
    {
        public DateTime time { get; set; }
        public string symbol { get; set; }
        public double price { get; set; }
        public double round { get; set; }
    }

【讨论】:

  • 您的解决方案在 ListView 中添加了行,但没有值。这是截图f5.s.qip.ru/twYEFNrp.png
  • 这并不意味着...Select 只提取这三个字段。如果您可以通过一些示例输入发布您的预期输出,那么这将大大缩小您想要实现的目标。
  • 我刚刚编辑它以添加最新记录的价格和回合,看看这是否是你想要做的。
  • 干杯!下一次,如果您可以连同您的代码一起提供示例数据,并显示您希望结果的样子,那么帮助您会容易得多。祝你好运!
  • 有关新问题的帮助,请发布新问题。
【解决方案2】:

根据我对您问题的理解,这是一个幼稚的解决方案。将您的 ItemsSource 替换为如下所示的 Linq 表达式以进行限制和排序。

using System.Linq;

ListView.ItemsSource = SignalR.OrderByDescending(s => s.timee).Where(s => (DateTime.Now - s.timee).TotalMinutes < 10);

如果您的列表会变得很长,则需要考虑一些性能和可扩展性问题。

如果您想显示在​​过去 10 分钟内为每个符号添加的行数,这有点不同,您可能需要编辑 GUI 以处理输出,该输出是带有属性的 anonymous objects 列表称为SymbolCountLastAdded。如果您更清楚,您可以创建一个名为 SymbolCounter 的类并使用它来代替匿名类。

ListView.ItemsSource = SignalR.Where(s => (DateTime.Now - s.timee).TotalMinutes < 10).GroupBy(s => s.symbol, (key, values) => new {Symbol = key, Count = values.Count(), LastAdded = values.Max(s => s.timee)});

如果您想过滤以便只显示给定符号值的行,只需使用SignalR.Where(s =&gt; s.symbol == "AAPL")....

您可以找到许多 Linq 扩展方法 here 的文档。这些可以链接并应用于您的初始列表。有很多关于这个的教程。

【讨论】:

  • 感谢您的回复,请告诉我如何改进此解决方案。例如,如果没有重复的行,其中符号=“AAPL”例如?
  • 需要类 SignalRounding 添加 Count 吗?
  • 不,您不需要将Count 属性添加到SignalRounding。在该示例中,ItemsSource 不再是 SignalR 对象列表,而是属性略有不同的匿名对象列表。我会编辑答案。
  • 不知道为什么,但是如果你写这样的代码List.ItemsSource = SignalR; 列表是更新的,但是如果我会添加。哪里 - 列表没有更新
  • 如果我在 ListVIew 中添加此列 - Count 、 LastAdded - 显示行 Symbol、Count 和 Last LastAdded ,但不显示价格和回合
猜你喜欢
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 2014-12-27
相关资源
最近更新 更多