C# 如何从列表或任何db对象返回数据,按天、周或月分组
嗨! 我有一个数据库模型,其中包含诸如receivedMsg、receivedTime和SentBy之类的信息 现在我想把这些信息按数组排序。。 如果消息的时间不到24小时,则它应该在今天数组中;如果消息的时间超过24小时,则它应该在星期数组中。 早于一周的所有内容都应在Previous数组中 输出应按以下格式显示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 :
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; }
}