【问题标题】:Sort list index by value按值排序列表索引
【发布时间】:2014-08-20 23:55:12
【问题描述】:

我有一个 C# 列表

List<int> temp = new List<int>(0, 1, 2, 3, 4, 2, 8);

我想在temp 中列出满足布尔表达式的项目,例如

List<int> results = temp.Sort(x > 2);

但是 .Sort() 不存在。结果列表results 将包含

(3, 4, 6)

原始列表temp 中大于 2 的值的索引有哪些。

对不起,如果这是微不足道的或以前曾被问过;我是编码和 SO 的新手。谢谢!

编辑:正如你们中的一些人正确指出的那样,我实际上并不想排序列表,我只想过滤它。谢谢!

【问题讨论】:

  • 在我看来这根本不像 排序。它看起来像 projecting 和 filtering...
  • 这就是为什么 OP 说“布尔表达式,例如”。他并不是说它存在并且不起作用。 @Jon,这不是针对您,而是针对评论和删除它的人。
  • 与其添加“编辑”部分,不如直接改写您的问题以使其更清晰?

标签: c# list sorting indexing


【解决方案1】:

我想在 temp 中创建一个满足 bool 表达式的项目列表,

那就是Where:

List<int> temp = new List<int>(0, 1, 2, 3, 4, 2, 8);

List<int> results = temp.Where(x => x > 2);

Select 和 Where 有许多变体,其中包括符合条件的项目的索引 - 如果您可以更清楚地想要什么,那么您将获得更好的示例。

【讨论】:

  • “哪些是原始列表中值的索引”-您的答案不包括这一点。
  • 不清楚(对我来说)这是 desired 输出还是 current 输出。
  • 我认为 OP 对他们问题的更新以及其他答案现在让事情变得更加清晰。
【解决方案2】:

你可以试试这个:

List<int> results = temp.Select((x, index) => new { Index = index, Number = x })
                        .Where(x=>x.Number > 2)
                        .Select(x=>x.Index);

【讨论】:

  • 提问者希望这些项目的索引大于 2。
  • @billpg 和 Daniel Kelley 请参阅我更新的帖子。谢谢。
  • @Christos 使用 linqPad 或 VS 来检查你的语法,而不是直接写在这里。
  • @I4V 我有什么错误吗?谢谢你的建议。
  • @I4V 我刚刚更正了我发现的一个错误,即丢失的)。谢谢!
【解决方案3】:

从输出看来,您需要索引

List<int> temp = new List<int>{0, 1, 2, 3, 4, 2, 8};
var newList = temp.Select((r, i) => new { Index = i, Value = r })
                    .Where(r => r.Value > 2) //For your condition
                    .OrderBy(r => r.Value)
                    .Select(r => r.Index)   //For output
                    .ToList();

这将返回您(3, 4, 6)

编辑:由于问题已被编辑并指出不需要根据值对列表进行排序,因此可以省略上述语句中的OrderBy。

var newList = temp.Select((r, i) => new { Index = i, Value = r })
                    .Where(r => r.Value > 2) //For your condition
                    .Select(r => r.Index)   //For output
                    .ToList();

【讨论】:

  • 我认为您不需要 OrderBy。即使提问者谈到“排序”,他们似乎也不是这个意思。
  • @billpg,我会把它留给 OP,如果不需要排序,那么 OP 可以忽略它。
【解决方案4】:

在应用where子句之前需要先保存索引,否则会丢失。

List<int> temp = new List<int>{ 0, 1, 2, 3, 4, 2, 8 };
List<int> results = temp.Select((x,i) => new { Value = x, Index = i })
                        .Where(x => x.Value > 2)
                        .Select(x => x.Index)
                        .ToList();

【讨论】:

    【解决方案5】:

    一个简单、快速且易于理解的解决方案是:

    for (int i = 0; i < temp.Count; i++)
        if(temp[i] > 2) results.Add(i);
    

    【讨论】:

    • 但是……但是……这个答案中没有 LINQ! :)
    • @billpg 我喜欢 LINQ,但有时它只会让解决一个非常简单的问题变得更加复杂。
    猜你喜欢
    • 2023-03-30
    • 2014-09-17
    • 2020-02-07
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    相关资源
    最近更新 更多