查找列表中一系列项目中的第一项

时间:2017-10-24 18:42:29

标签: c# linq

我在C#中有以下数据,我需要找到第一个BUY / SELL(参见Status列)的出现以及相应的Stock和其对应的Price

例如,我在列表中根据Date订购了以下项目:

enter image description here

我已为BUY突出显示黄色的第一个SELLAAPL以及MSFT的橙色,以便更好地理解。

LINQ查询应该给我以下结果:

enter image description here

2 个答案:

答案 0 :(得分:3)

您可以使用提供索引的Where重载,并与之前的记录进行比较:

var results = data.Where( (r, i) => i == 0 || data[i-1].Status != r.Status);

以上假定为List<T>。如果你拥有的只是一个IEnumerable它会更麻烦,但你可以使用:

    var results2 = data.Where( r =>
        {
            var prior = data.Where(j => j.Date < r.Date)
                            .OrderByDescending(j => j.Date)
                            .FirstOrDefault();
            return (prior == null || prior.Status != r.Status);
        }
    );

或者,当然,您只需创建一个列表并使用它:

var list = data.ToList();
var results = list.Where( (r, i) => i == 0 || list[i-1].Status != r.Status);

Full example on DotNetFiddle

答案 1 :(得分:1)

public partial class Transaction
    {
         public DateTime Date {get; set;}
         public string Stock {get; set;}
         public decimal Price {get; set;}
    }

如果我理解正确你有一个对象列表?如果您想要的是获得买入,卖出,买入,卖出的清单...按日期排序您的唯一选择似乎是一个循环。

var status = "BUY";
List<Transaction> newList = new List<Transaction>();
    foreach (var item in list.OrderBy(x=>x.Date)){
     if(item.Status == status){
          newList.Add(item);
          status = status == "BUY"?"SELL":"BUY";
     }
}

&#34;列表&#34;是原始的对象列表。 &#34; newList&#34;是循环返回的内容。