【问题标题】:Order by field with lambda expression使用 lambda 表达式按字段排序
【发布时间】:2018-08-13 02:31:08
【问题描述】:

我正在尝试按其中一个字段对列表进行排序。

我在一个分组列表中有两个列表。第一个包含 Id,第二个包含计数。我成功地能够按 Id 对列表列表进行分组并重新格式化。

for (int i = 0; i < GroupedListofLists.Count; i++)
            {
                tempo_Id.Add(GroupedListofLists[i][0]);
                tempo_count.Add(GroupedListofLists[i][1]);
            }

GroupedListofLists.Clear();
GroupedListofLists.Add(tempo_Id);
GroupedListofLists.Add(tempo_count);

如果我打印出 GroupedListofLists,我将拥有不同的 ID (GroupedListofLists[0]),每个 ID 的计数都在第二个中 (GroupedListofLists [1])。

现在,当我尝试使用 lambda 表达式对该列表进行排序时,我遇到了问题。我尝试了这两种方法:

GroupedlistofLists.Sort( (a, b) =>  Convert.ToDouble(a[idx]).CompareTo(Convert.ToDouble(b[idx])));

GroupedlistofLists = GroupedlistofLists.OrderBy(x => Convert.ToDouble(x[idx])).ToList();

出现了问题。

在第一种方法中,无论我对变量 'idx' 使用什么值,都会为 a 分配 GroupedListofLists[0] 的值,为 b 分配 GroupedListofLists[1] 的值。

其次,无论我对变量“idx”使用什么值(0 或 1),x 都将始终包含 GroupedListofLists[0] 的值。哪个是 Id 值,我需要按 Count 对它们进行排序,所以 GroupedListofLists[1]。

我希望我很清楚。 提前谢谢你。

【问题讨论】:

  • 请提供代码示例以及您分组的部分,如果您能列出并提供类定义,那就太好了。
  • 这个list到底是什么?就个人而言,我认为最好在这里编写并调用一个实际的比较方法......然后你完全控制发生的事情。
  • 你好,我编辑了,这样更清楚,列表实际上是 GroupedListofLists。

标签: c# .net sorting lambda listobject


【解决方案1】:

我不完全知道你想做什么。但我会做一个猜测:

// Build some List you want to sort
List<string> myList = new List<string>() { "3", "1", "2" };
// Sort the List
myList = myList.OrderBy(a => Convert.ToDouble(a));

OrderBy 中的 Lambda-Expression 需要选择一个默认排序的值。将为列表中的每个项目运行 Lambda-Expression。结果将用作 order-key。你不需要任何索引。 可以使用 sort 来对复杂类型进行排序。

更好的版本应该适用于具有正确类和类型的列表。应避免在 lambda 表达式中使用 Convert!

// Some example-class with multiple properties
public class MyItem
{
    public string Name { get; set; }
    public double Value { get; set; }
}

// Some test-data
List<MyItem> myList = new List<MyItem>()
{
    new MyItem() { Name = "One", Value = 1 },
    new MyItem() { Name = "Three", Value = 3 },
    new MyItem() { Name = "Two", Value = 2 }
}

// select the value you want to use for ordering the list.
myList = myList.OrderBy(item => item.Value);

// Expected output: 1, 2, 3
foreach(MyItem item in myList)
{
    Console.WriteLine(item.Value + ", " + item.Name);
}

// Expected output: 3, 2, 1
myList = myList.OrderBy(item => item.Name);

foreach(MyItem item in myList)
{
    Console.WriteLine(item.Value + ", " + item.Name);
}

(我没有安装 Visual Studio,所以请检查拼写错误;))

【讨论】:

  • 您好,感谢您的回答,但我正在使用嵌套列表。这不起作用。
猜你喜欢
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
相关资源
最近更新 更多