使用LINQ进行列表迭代,同时显示列表位置

4

我刚刚问了一个关于我的班级的问题:

Public class Parent {
        public IList<ParentDetail> ParentDetails {
            get { return _ParentDetails; }
        }
        private List<ParentDetail> _ParentDetails = new List<ParentDetail>();
        public Parent() {
            this._ParentDetails = new List<ParentDetail>();
        }
    }

    public class ParentDetail {
        public int Id { get; set; }
    }

}

这里的一个专家(Jon)告诉我如何按照ParentDetails.Id的顺序迭代遍历这个类。以下是他的解决方案,非常好用。 之前的问题

foreach(var details in Model.Parent.ParentDetails.OrderBy(d => d.Id))
{
    // details are processed in increasing order of Id here
    // what's needed is to get access to the original order
    // information. Something like as follows:
    // select index position from ParentDetails where Id = details.ID
}

我还需要在foreach循环中显示与Id对应的列表索引值以及ParentDetail类中的其他数据。

例如,在“// details are processed”处,我希望能够打印出与foreach循环中当前Id对应的索引值。


你能提供原问题的链接吗? - Justin Morgan
1
您不需要两次初始化“_ParentDetails”。 - spender
@spender - 是的,我也对此感到困惑,但另一个用户建议这样做。我应该从以private开头的那一行中删除“= new List<ParentDetail>()”吗? - Emily
@asawyer - 当我说“print”时,我的意思是可用的。实际上,这都在一个MVC网页内,所以我需要获取原始索引值,并将其作为DIV ID的一部分。 - Emily
2个回答

6

使用第二个Enumerable.Select方法:

foreach(var details in Model.Parent.ParentDetails
                            .Select((value, idx) => new { Index = idx, Value = value })
                            .OrderBy(d => d.Value.Id)
                           )
{
    // details are processed in increasing order of Id here
    Console.WriteLine("{0}: {1}", details.Index, details.Value);
} 

这里假设您希望索引按照原始顺序排列。

你漏掉了原问题中的 OrderBy 部分。 - Roman
@Travis - 你好 Travis。你能帮我检查一下我的原始问题吗?Jon似乎有我需要的解决方案,但它没有显示我仍然需要的索引位置。 - Emily
@Travis - 谢谢。我尝试了一下,发现在OrderBy的最后一行的Id部分下面有一个红色的下划线。 - Emily
+1,我认为现在我更清楚她想做什么,这是最好的方法。 - Justin Morgan
似乎是相反的,即(value, index)Func<TSource, int, TResult> - kamilk
@kamilk:确实。我想知道这个错误的答案为什么能够存活这么长时间。 - Travis Gockel

1
你可以使用普通的 for 循环来实现。
var ordered = Model.Parent.ParentDetails.OrderBy(d => d.Id).ToList();

for(int i = 0; i < ordered.Count; i++)
{
   // details are processed in increasing order of Id here
}

她需要原始排序中元素的索引,而不是在重新排序后的索引,因此这并没有真正回答问题。 - Roman
@R0MANARMY - 这是正确的。Jon在先前的问题中提出的解决方案是我所见过的最接近的。但我仍然不确定如何获取原始索引位置。我知道这听起来很奇怪,但那是我编写代码的唯一方式。数据必须按随机顺序排序,在屏幕上以正常顺序呈现,但可以访问原始位置信息。 - Emily
@R0MANARMY 和 @Emily - 我明白了,从问题描述中我没有表达清楚。在这种情况下,我会选择Travis的答案,但如果必须的话,您可以使用for方法在运行OrderBy之前设置某种编号列表。 - Justin Morgan
@Emily:Travis的解决方案大部分是正确的,我编辑了一下,加入了“OrderBy”查询,以便完整。然而,鉴于他的解决方案,你应该能够将其与你在之前问题中收到的答案结合起来。如果你不能,那么你应该花些时间学习Linq。 - Roman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接