从源列表中获取由分组项目列表组成的列表

时间:2019-03-04 16:53:18

标签: c# linq

所以我有一个这样的数据库源列表。

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.

我希望这很清楚。

谢谢

3 个答案:

答案 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