如何使用LINQ仅获取上次日期

时间:2016-04-20 16:29:21

标签: c# linq

我有以下代码:

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个元素。

我的查询为我提供了所有具有先前日期的元素,然后对它们进行排序。

如何为每个“名字”返回一个元素(最近的前一个日期)?

4 个答案:

答案 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);
        }
    }
}

我希望它对你有所帮助,如果有的话,请将其标记为答案:)