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

时间:2016-01-22 08:15:47

标签: c# asp.net-mvc list

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

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

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

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

但我已经按照以下序列2,3,4对products进行了排序。我想根据我在第4页,第2页,第3页中选择的记录保留序列。怎么解决?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

多重选择框不会保留点击次序。

您需要使用Javascript来观看点击次数,并将订单记录到隐藏字段中,该字段将随表单一起提交。或者放弃多选框,并使用this one之类的组件。 (那不是.NET组件,但我怀疑存在类似的组件。)

答案 2 :(得分:0)

您需要执行GroupJoin

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

这相当于“左外连接”,它以原始顺序维护listIDs的值,然后将每个listID与表格中的相应产品相匹配。

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