我在C#中有以下数据,我需要找到第一个BUY
/ SELL
(参见Status
列)的出现以及相应的Stock
和其对应的Price
。
例如,我在列表中根据Date
订购了以下项目:
我已为BUY
突出显示黄色的第一个SELL
和AAPL
以及MSFT
的橙色,以便更好地理解。
LINQ查询应该给我以下结果:
答案 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);
答案 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;是循环返回的内容。