我有以下代码:
public class ModelData
{
public string name;
public DateTime DT;
public int real;
public int trade;
public int position;
public int dayPnl;
public double ATR;
public double C2C;
public double C;
}
List<ModelData> modelData;
var priorDateRealTrades = modelData
.Where(x => x.DT.Date <= aDate.Date)
.OrderBy(x => x.DT.Date)
.ToArray();
我真的只想为每个“名字”选择1个元素。
我的查询为我提供了所有具有先前日期的元素,然后对它们进行排序。
如何为每个“名字”返回一个元素(最近的前一个日期)?
答案 0 :(得分:3)
使用GroupBy()和FirstOrDefault()
var priorDateRealTrades = modelData
.GroupBy(d => d.Name)
.Select(gd => gd.Where(x => x.DT.Date <= aDate.Date)
.OrderBy(x => x.DT.Date)
.First())
.ToList()
这将按名称分组,然后选择每个组中的第一个orderd / where'd。如果没有记录与/ criteria的日期匹配,则会抛出异常。这可能是一项要求......
OR
var priorDateRealTrades = modelData
.GroupBy(d => d.Name)
.Select(gd => gd.Where(x => x.DT.Date <= aDate.Date)
.OrderBy(x => x.DT.Date)
.FirstOrDefault())
.Where(d => d != null)
.ToList()
这将与前一个相同,但也将过滤掉没有日期匹配的结果(它们将为null)并且不会抛出异常。
答案 1 :(得分:1)
你可以这样做:
var query = modelData
.Where(x => x.DT.Date <= aDate.Date)
.GroupBy(r => r.name)
.Select(grp => new
{
Name = grp.Key,
LastDate = grp.OrderBy(t => t.DT.Date).FirstOrDefault()
});
它的作用是:
Date
Name
并仅选择单 Date
。 如果您只想获取Date
值,那么您的查询应为:
var query = modelData
.Where(x => x.DT.Date <= aDate.Date)
.GroupBy(r => r.name)
.Select(grp => grp.OrderBy(t => t.DT.Date).FirstOrDefault());
答案 2 :(得分:0)
这样的事情对你有用吗?
var priorDateRealTrades = modelData.Where(t => t.DT <= aDate.Date && t.DT <= DateTime.Now).OrderByDescending(t => t.DT).FirstOrDefault();
编辑:
抱歉,我没有意识到你的名字可能会重复。
var priorDateRealTrades = modelData
.GroupBy(t => t.name)
.Select(t => t.Where(t2 => t2.DT <= aDate.Date && t2.DT <= DateTime.Now).OrderByDescending(t3 => t3.DT)
.FirstOrDefault());
答案 3 :(得分:0)
您只需使用IEnumerable.Distinct()
并创建一个实现的类
IEqualityComparer<T>
可能是这样的:
public class ModelData
{
public string name;
public DateTime DT;
public int real;
public int trade;
public int position;
public int dayPnl;
public double ATR;
public double C2C;
public double C;
}
private class ModelDataNameComparator : IEqualityComparer<ModelData>
{
public bool Equals(ModelData x, ModelData y)
{
return x.name.Equals(x.name.ID);
}
public int GetHashCode(ModelData obj)
{
return obj.name.GetHashCode();
}
}
public class Program
{
static void Main()
{
List<ModelData> modelData = ModelRepository.GetAllModelDataFromMagicPlace();
var priorDateRealTrades = modelData.OrderByDescending(d => d.DT)
.Distinct(new ModelDataNameComparator())
.ToList();
foreach(ModelData md in priorDateREalTrades)
{
Console.WriteLine("name: {0}, Date: {1}", md.name, md.DT);
}
}
}
我希望它对你有所帮助,如果有的话,请将其标记为答案:)