【问题标题】:Set values with a Linq-Query?使用 Linq 查询设置值?
【发布时间】:2009-11-22 00:01:59
【问题描述】:

在我的应用程序中,我有一个需要按价格排序的项目列表,并为每个项目设置排名/位置索引。我需要存储排名,因为之后价格可能会发生变化。目前我正在这样做:

var sortedlistKFZ = from res in listKFZ orderby res.Price select res;
if (sortedlistKFZ.Any())
{
     int rankPosition = 1;
     foreach (Result kfz in sortedlistKFZ)
     {
           kfz.MesaAdvertNumber = rankPosition;
           rankPosition++;
     }
}

有没有更短的方法?

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    这可行吗?

    int rankPosition = 1;
    var sortedListKFZ = listKFZ.OrderBy(r => r.Price).Select(r => {
        r.MesaAdvertNumber = ++rankPosition;
        return r;
    });
    

    【讨论】:

    • 它会,除了一个小细节......编号将从2开始。您需要将增量更改为后缀(rankPosition++)或将rankPosition的初始值更改为0。
    【解决方案2】:

    您可以使用let 关键字来实现。这应该工作......

    Int32[] numbers = new Int32[] { 3, 6, 4, 7, 2, 8, 9, 1, 2, 9, 4 };
    
    int count = 1;
    var ranked = 
        from n in numbers
        let x = count++
        select new {
            Rank = x,
            Number = n
        };
    

    【讨论】:

      【解决方案3】:

      最简单的是

      (from res in listKFZ orderby res.Price select res).ToList().ForEach(...)
      

      当然,您可以为 IEnumerable 编写自己的 ForEach 扩展,但我记得我对它有副作用。最好在List上操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-18
        • 2012-02-02
        • 1970-01-01
        • 2012-10-11
        • 2012-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多