C# 如何从列表或任何db对象返回数据,按天、周或月分组

C# 如何从列表或任何db对象返回数据,按天、周或月分组,c#,linq,group-by,.net-core,C#,Linq,Group By,.net Core,嗨! 我有一个数据库模型,其中包含诸如receivedMsg、receivedTime和SentBy之类的信息 现在我想把这些信息按数组排序。。 如果消息的时间不到24小时,则它应该在今天数组中;如果消息的时间超过24小时,则它应该在星期数组中。 早于一周的所有内容都应在Previous数组中 输出应按以下格式显示 Today[ {receivedMsg : "hii", sentBY : "xyz"}, {receivedMsg : "hii2", sentBY :

嗨! 我有一个数据库模型,其中包含诸如receivedMsg、receivedTime和SentBy之类的信息

现在我想把这些信息按数组排序。。 如果消息的时间不到24小时,则它应该在今天数组中;如果消息的时间超过24小时,则它应该在星期数组中。 早于一周的所有内容都应在Previous数组中

输出应按以下格式显示

Today[
   {receivedMsg : "hii",
   sentBY : "xyz"},

   {receivedMsg : "hii2",
   sentBY : "xyz"},

],
This Week[
   {receivedMsg : "hii3",
   sentBY : "xyz"},

   {receivedMsg : "hii4",
   sentBY : "xyz"},

],
Earlier[
   {receivedMsg : "hii5",
   sentBY : "xyz"},

   {receivedMsg : "hii6",
   sentBY : "xyz"},

]

请注意,我正在使用linq和C,我希望,我理解你:

    public class RearrangeMessagesInArray
    {
        public void RearrangeMessagesInArrays(Message[] today, Message[] week, Message[] earlier)
        {
            // To work with linQ, convert array to list.
            var earlierAsList = earlier.ToList();
            // Add all messages to "earlier" - array, when its older then 7 days
            earlierAsList.ToList().AddRange(GetAllMessagesForGivenArrayAndTime(today, Times.Earlier));
            earlierAsList.ToList().AddRange(GetAllMessagesForGivenArrayAndTime(week, Times.Earlier));
            //return to "earlier" - array.
            earlier = earlierAsList.ToArray();

            // Add all messages to "week"-array, which is older than one day and newer than 7 days and remove all which is over 7 days
            week = GetAllMessagesForGivenArrayAndTime(week, Times.Week).ToArray();

            // Reassign "today"-array without messages, which are older than 1 one day.
            today = GetAllMessagesForGivenArrayAndTime(today, Times.Day).ToArray();

            PrintOutArrayAsJson(today, week, earlier);
        }

        private void PrintOutArrayAsJson(Message[] today, Message[] week, Message[] earlier)
        {
            today.ToList().ForEach(message => Console.WriteLine(WriteFromObject(message)));
            week.ToList().ForEach(message => Console.WriteLine(WriteFromObject(message)));
            earlier.ToList().ForEach(message => Console.WriteLine(WriteFromObject(message)));
        }

        private IEnumerable<Message> GetAllMessagesForGivenArrayAndTime(Message[] messages, Times time )
        {
            switch (time)
            {
                case Times.Day:
                    return from message in messages
                        where GetDaysDiffBetweenNowAndGivenDate(message.ReceivedTime) <= 1
                        select message;

                case Times.Week:
                    return from message in messages
                        where GetDaysDiffBetweenNowAndGivenDate(message.ReceivedTime) <= 7 
                              && GetDaysDiffBetweenNowAndGivenDate(message.ReceivedTime) > 1
                           select message;

                case Times.Earlier:
                    return from message in messages
                        where GetDaysDiffBetweenNowAndGivenDate(message.ReceivedTime) > 7
                        select message;
                default:
                    return null;

            }
        }

        private int GetDaysDiffBetweenNowAndGivenDate(DateTime givenDateTime)
        {
            return (DateTime.Today - givenDateTime).Days;
        }

        public class Message
        {
            public string ReceivedMessage { get; set; }
            public DateTime ReceivedTime { get; set; }
            public string SentBy { get; set; }
        }

        private enum Times { Day, Week, Earlier};

        // Create a User object and serialize it to a JSON stream.  
        public string WriteFromObject(Message message)
        {

            // Create a stream to serialize the object to.  
            var ms = new MemoryStream();

            // Serializer the User object to the stream.  
            var ser = new DataContractJsonSerializer(typeof(Message));
            ser.WriteObject(ms, message);
            byte[] json = ms.ToArray();
            ms.Close();
            return Encoding.UTF8.GetString(json, 0, json.Length);
        }

    }

您可以首先定义范围并使用select来获得所需的结果。 我还没有真正检查这些范围是否正确,但你应该知道如何继续。看


难道有些人不认为这应该比这样的事情复杂得多吗:

class Program
{
  static void Main( string[] args )
  {
    IEnumerable<Item> items = Enumerable.Empty<Item>();

    ( Age Age, Item[] Items )[] partitioned =
      items
      .Select( item => ComputeAge(item) )
      .GroupBy( x => x.Age )
      .Select( g => (
        Key    : g.Key ,
        Values : g.Select( x => x.Item )
                  .ToArray()
      ))
      .ToArray();
      ;

  }
  static ( Item Item, Age Age ) ComputeAge(Item item)
  {
    double days = (DateTime.Now - item.Received).TotalDays;
    Age age;

    // Does "week" means "with the last 7 days" or "within the current calendar week"
    // We'll assume it means within the last 7 days.
    if      ( days <  0.0 ) age = Age.Unknown;
    else if ( days <= 1.0 ) age = Age.Today;
    else if ( days <= 7.0 ) age = Age.Today;
    else                    age = Age.Earlier;

    return (item, age) ;
  }

}

public enum Age { Unknown = 0, Today = 1, ThisWeek = 2, Earlier = 3 }

class Item
{
  public string   Message  { get; set; }
  public string   Sender   { get; set; }
  public DateTime Received { get; set; }
}


您能否展示您的尝试,以便我们尝试并完善它?您的问题是什么?这和你的头衔有什么关系?
class Program
{
  static void Main( string[] args )
  {
    IEnumerable<Item> items = Enumerable.Empty<Item>();

    ( Age Age, Item[] Items )[] partitioned =
      items
      .Select( item => ComputeAge(item) )
      .GroupBy( x => x.Age )
      .Select( g => (
        Key    : g.Key ,
        Values : g.Select( x => x.Item )
                  .ToArray()
      ))
      .ToArray();
      ;

  }
  static ( Item Item, Age Age ) ComputeAge(Item item)
  {
    double days = (DateTime.Now - item.Received).TotalDays;
    Age age;

    // Does "week" means "with the last 7 days" or "within the current calendar week"
    // We'll assume it means within the last 7 days.
    if      ( days <  0.0 ) age = Age.Unknown;
    else if ( days <= 1.0 ) age = Age.Today;
    else if ( days <= 7.0 ) age = Age.Today;
    else                    age = Age.Earlier;

    return (item, age) ;
  }

}

public enum Age { Unknown = 0, Today = 1, ThisWeek = 2, Earlier = 3 }

class Item
{
  public string   Message  { get; set; }
  public string   Sender   { get; set; }
  public DateTime Received { get; set; }
}