如何根据 2 个属性筛选列表

本文关键字:属性 筛选 列表 何根 | 更新日期: 2023-09-27 17:58:25

我的代码中有一个列表,我需要根据两个条件过滤并返回特定的行。 有问题的列表是数据库中的模型列表。 每个模型上有两个 ID 属性,一个是数据表中的 ID 并且是唯一的,另一个是我们用来标识组并且可以重复的 ID。 我们称它们为 ID 和 GroupID。 基本上,我希望结果列表每个组 ID 只有一个,它应该是具有最高(数字上(ID 的列表。 例如:

输入:

List<MyModel> modelList = new List<MyModel>
modelList[0].ID = 1   modelList[0].GroupID = 5
modelList[1].ID = 2   modelList[1].GroupID = 5
modelList[2].ID = 3   modelList[2].GroupID = 6
modelList[3].ID = 4   modelList[3].GroupID = 6

期望输出:

Models at indexes 1 and 3.

如何根据 2 个属性筛选列表

使用 LINQ:

var items = (from model in modelList
             group model by model.GroupID into modelGroup
             select modelGroup.Max(i => i.ID)).ToList();

这里要做的是首先按 ID 对模型列表进行排序,然后按 GroupID 对列表项进行排序,然后拉取具有最大 Id 值的项目。

var result = modelList.OrderByDescending(x => x.ID).GroupBy(x => x.GroupID).Select(x => x.First());

上面的查询将为您提供结果。

这是您的解决方案:

var myData = models.GroupBy(model => model.GroupId)
                   .Select(group => group.OrderByDescending(model => model.Id).First());

或者你也可以这样做:

var myData = models.GroupBy(model => model.GroupId)
                   .Select(group => group.First(model => model.Id == group.Max(model1 => model1.Id)));

为了好玩,这里有一个小提琴。

您可以尝试使用 GroupBy。

var q = modelList.GroupBy(x => x.GroupID, x => x, 
                             (key, g) => new { 
                                             GroupID = key, 
                                             Id = g.Max(c => c.ID)
                                           });

这应该按GroupId对所有元素进行分组,并在其中一个组中选择Max ID

试试这段代码:

List<MyModel> modelList = new List<MyModel>();
modelList.Add(new MyModel());
modelList.Add(new MyModel());
modelList.Add(new MyModel());
modelList.Add(new MyModel());
modelList[0].ID = 1; modelList[0].GroupID = 5;
modelList[1].ID = 2; modelList[1].GroupID = 5;
modelList[2].ID = 3; modelList[2].GroupID = 6;
modelList[3].ID = 4; modelList[3].GroupID = 6;
var list = from ml in modelList group ml by ml.ID into r select new { ID = r.Key, MaxGroupID = r.Max() };

这可能会对你有所帮助 modelList.GroupBy(model => model.GroupId, g => g.Id).Select(item => item.Max())

var newModelList = modelList.GroupBy(ml => ml.GroupID)
.Select(g => new MyModel
{
    ID = g.OrderByDescending(x => x.ID).First().ID,
        GroupID = g.Key
}).ToList();

1(然后GroupBy Select获得GroupID上不同的项目。

2(First() OrderByDescending后获得最高ID

3(Select new MyModel只是为了明确投影。