如何在列表中保持数据的顺序

本文关键字:数据 顺序 列表 | 更新日期: 2023-09-27 18:31:22

我有一个带有复选框的下拉列表。假设我在下拉列表中显示了以下数据:

<select multiple="multiple" name="Products" id="Products">
    <option value="1">A</option>
    <option value="2">B</option>
    <option value="3">C</option>
    <option value="4">D</option>
</select>

然后我检查了记录 4、2、3 并提交了页面。在控制器中,我将int[] arrIDs更改为List<int> listIDs,以从数据库中收集产品。

List<Product> products = db.Product
    .Where(d => listIDs.Contains(d.ProductID))
    .ToList();

但是我得到了products按以下顺序 2、3、4 排序。我想根据我在第 4、2、3 页中选择的记录保留序列。如何解决?

如何在列表中保持数据的顺序

您可以使用List.IndexOf来获取订单的索引:

List<Product> products = db.Product
    .Where(d => listIDs.Contains(d.ProductID))
    .AsEnumerable()
    .OrderBy(d => listIDs.IndexOf(d.ProductID))
    .ToList();

多选框不保留单击顺序。

您需要使用 Javascript 来观察点击,并将订单记录到一个隐藏字段中,该字段将与表单一起提交。 或者放弃多选框,使用像这样的组件。 (这不是 .NET 组件,但我怀疑存在类似的组件。

你需要

做一个GroupJoin

List<Product> products = listIDs
    .GroupJoin(
        db.Product,
        x => x,
        y => y.ProductID,
        (x, ys) => ys.First())
    .ToList();

这执行等效于"左外连接",它以原始顺序维护listIDs的值,然后将每个listID与表中的相应产品进行匹配。

注意:此代码假定数据库中始终存在一个匹配的ProductID