所以我有一个这样的数据库源列表。
List<FileInfo> FileInfosList = DataBase.GetFileInfoslist(LoginInfo);
这将返回一个包含大约50行FileInfo类型的列表。 列表中的每一行都有10个字段,两个分别是开始时间和索引
double starttime is starttime of media
int index is a index number from 0 to 3
我对列表进行这样的排序
List<FileInfo> sortedList = FileInfos.OrderBy(s => s.StartTime).ThenBy(c => c.Index).ToList();
因此,我需要从此排序列表中提取行组,其中开始时间在50行或记录中匹配。每个组中可能有1至4行。 而且我需要留下一组具有匹配开始时间的组的列表。
例如,如果我想提取一组与我将使用的列表中第一行的开始时间匹配的行,则
double starttime = sortedList[0].StartTime;
List<FileInfo>() group = sortedList.Where(x => x.StartTime ==
starttime).ToList();
但是我需要一种方法来遍历整个排序列表,并获取所有具有匹配开始时间的组,每个组可能是1至4行(其变量),索引编号保持在0至3的排序顺序。 然后,所有这些组都需要放在我可以使用的主列表中。
类似
List<FileInfo> GroupOfFileInfo = list of rows with matching starttimes from source list
我想结束
List<GroupOfFileInfo> groupslist for the entire source list.
我希望这很清楚。
谢谢
答案 0 :(得分:1)
如评论所述,使用.GroupBy()。
GroupBy使用起来可能有些混乱,所以这是一个示例控制台应用程序:
class Program
{
//Simple 'file info' class
public class FileInfo
{
public int Index { get; set; }
public DateTime StartTime { get; set; }
public string OtherInfo { get; set; }
}
//Set up example data.
static List<FileInfo> data = new List<FileInfo>()
{
new FileInfo{ Index = 0, StartTime = new DateTime(2019,01,01), OtherInfo="Item 0" },
new FileInfo{ Index = 1, StartTime = new DateTime(2019,01,01), OtherInfo="Item 1" },
new FileInfo{ Index = 2, StartTime = new DateTime(2019,01,01), OtherInfo="Item 2" },
new FileInfo{ Index = 3, StartTime = new DateTime(2019,02,01), OtherInfo="Item 3" },
new FileInfo{ Index = 4, StartTime = new DateTime(2019,02,01), OtherInfo="Item 4" },
new FileInfo{ Index = 5, StartTime = new DateTime(2019,02,01), OtherInfo="Item 5" },
new FileInfo{ Index = 6, StartTime = new DateTime(2019,03,01), OtherInfo="Item 6" },
new FileInfo{ Index = 7, StartTime = new DateTime(2019,04,01), OtherInfo="Item 7" }
};
static void Main(string[] args)
{
//First GroupBy what you want to group by.
var groupedList = data.GroupBy(x => x.StartTime);
//This gives a list with the number of distinct group items.
foreach (var groupEntry in groupedList)
{
//groupEntry is an IGrouping, which contains 'key' as the group key
//(a DateTime in this case, StartTime in the source list)
Console.WriteLine($"Items in Group : {groupEntry.Key}");
//each item is itself an IEnumerable of the items in that group
foreach (var groupItem in groupEntry.OrderBy(x=>x.Index))
{
Console.WriteLine($" - Index:{groupItem.Index}; OtherInfo = {groupItem.OtherInfo}");
}
}
}
}
以上内容的输出
Items in Group : 01/01/2019 00:00:00
- Index:0; OtherInfo = Item 0
- Index:1; OtherInfo = Item 1
- Index:2; OtherInfo = Item 2
Items in Group : 01/02/2019 00:00:00
- Index:3; OtherInfo = Item 3
- Index:4; OtherInfo = Item 4
- Index:5; OtherInfo = Item 5
Items in Group : 01/03/2019 00:00:00
- Index:6; OtherInfo = Item 6
Items in Group : 01/04/2019 00:00:00
- Index:7; OtherInfo = Item 7
答案 1 :(得分:0)
让我们看看下面的代码是否有帮助...
IEnumerable<double> gourps = fileinfosList.Select(c => c.starttime).Distinct();
var groupedList = new Dictionary<double, List<FileInfo>>();
foreach (var grp in gourps)
{
groupedList.Add(grp, fileinfosList.Where(c => c.starttime == grp).OrderBy(d => d.index).ToList());
}
答案 2 :(得分:-1)
安装软件包MoreLINQ https://www.nuget.org/packages/morelinq/
并使用功能GroupBy