【问题标题】:IEnumerable list not reordering string[] list correctlyIEnumerable 列表未正确重新排序字符串 [] 列表
【发布时间】:2014-04-30 12:42:21
【问题描述】:

我有一个包含数组的string[] 列表。

数组包含两个元素,[0] = 分数,[1] = 难度(1 或 2)。

我使用以下LINQ 语句按照难度为2 的分数降序重新排列列表。

scoresDesHard = list.OrderByDescending(ld => lineData[0]).Where(ld => lineData[1] == "2");

我目前正在XNA 中将新排序的列表绘制到屏幕上,如下所示:

// draw highscores to the screen
public void Draw(SpriteBatch spriteBatch)
{

    string mainString = "";

    // build the hard list string
    foreach (var li in scoresDesHard)
    {

        mainString += li[0] + " " + li[1] + "\r\n";
    }

    spriteBatch.DrawString(scoreFont, ""+ mainString, hardScoresPos, Color.White);
}

它根本没有对列表进行排序,并且显示了两个难度的分数:

000001 1
000001 2
122122 1
125555 1
22 1
23131 2

它应该正在输出:

23131 2
00001 2

为什么排序失败?

【问题讨论】:

  • 您的查询应该有效。确保在应用过滤后枚举结果。附带问题 - 如果分数和难度都是数字,为什么要使用字符串?
  • 你确定没有2个变量scoresDesHard不小心吗?一个在设置它的方法中声明,一个在更大的范围内声明?
  • 字符串排序是字典序,需要按分数的数值排序。您应该创建自己的类型,而不是将事物表示为字符串数组。
  • @SergeyBerezovskiy 好点,我会将其更改为 int 列表。 “枚举结果”是什么意思?
  • 请发布一些实际代码。您发布的 linq 查询甚至无效

标签: c# linq list xna ienumerable


【解决方案1】:

我认为问题在于您将 ld 传递给 Lambda,但检查 lineData[1] == 2 我认为 LINQ 语句应该是这样的

scoresDesHard = list.Where(x => x[1] == "2").OrderByDescending(y => y[0]);


list.Where(foo => bar.Value1 == 123) //Always true or always false
list.Where(foo => foo.Value1 == 123) //checks each item in the list

【讨论】:

  • 应用排序时无关紧要(它对性能更好,但结果会相同) - 过滤以与源序列中相同的顺序返回项目
  • @SergeyBerezovskiy,您说得对,更改排序/位置的顺序不会影响最终结果。我总是把我的过滤器放在我的排序之前。我不知道编译器是否足够聪明,可以在排序之前进行过滤,或者它是否会对完整列表进行排序然后过滤它,这可能是一个性能问题。
  • @jrhutch 谢谢你的作品。您能否详细说明问题所在?
  • @crm 最好在订购前过滤掉您不需要的东西。因此,使用 Linq to Objects,您将获得更好的性能。
  • 我刚刚更新了我的答案,希望能更清楚地说明问题所在。
猜你喜欢
  • 2021-10-18
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 2019-04-29
  • 2014-12-08
  • 2013-07-31
  • 1970-01-01
  • 2012-01-09
相关资源
最近更新 更多