C# 按给定字段对字典值进行排序,字典值是对象列表

C# 按给定字段对字典值进行排序,字典值是对象列表,c#,linq,sorting,dictionary,C#,Linq,Sorting,Dictionary,我有一个SortedDictionary,它的值是对象列表。我想根据对象的给定属性对每个键的值(列表)进行排序。在当前情况下,我需要先按对象的lastname,然后按firstname对列表进行排序。我试过LINQ,结果很快就坏了,没有产生结果 编辑: 我的结构如下: public class Person { private string firstName; private string lastName; ... }

我有一个SortedDictionary,它的值是对象列表。我想根据对象的给定属性对每个键的值(列表)进行排序。在当前情况下,我需要先按对象的lastname,然后按firstname对列表进行排序。我试过LINQ,结果很快就坏了,没有产生结果

编辑:

我的结构如下:

    public class Person
    {
        private string firstName;
        private string lastName;

        ...
    }
我需要这本字典按键排序。然而,我需要将每个列表首先按人的姓排序,然后按姓排序

var dict = new SortedDictionary<string, List<Person>>();
var dict=new SortedDictionary();

我没有为排序提供代码,因为我无法让它工作。这就是我寻求帮助的原因。

您可以使用
List.Sort
,LINQ在这种情况下不起作用,因为您无法在枚举过程中修改字典(例如添加
或使用
属性):

foreach(var kv in yourSortedDictionary)
{
    kv.Value.Sort((p1, p2) => {
        int diff = p1.LastName.CompareTo(p2.LastName);
        if(diff != 0) return diff;
        return p1.FirstName.CompareTo(p2.FirstName);
    });
}
即使最好先添加一个已排序的列表,这种方法也能起作用


但正如我在评论中已经提到的,如果列表不能包含重复项,您可以使用a而不是
列表
。NET仍然缺少允许重复但已排序的单个值集合类型。

您可以使用
列表。Sort
,LINQ在这种情况下不起作用,因为您无法在枚举期间修改字典(例如添加
或使用
属性):

foreach(var kv in yourSortedDictionary)
{
    kv.Value.Sort((p1, p2) => {
        int diff = p1.LastName.CompareTo(p2.LastName);
        if(diff != 0) return diff;
        return p1.FirstName.CompareTo(p2.FirstName);
    });
}
即使最好先添加一个已排序的列表,这种方法也能起作用


但正如我在评论中已经提到的,如果列表不能包含重复项,您可以使用a而不是
列表
。NET仍然缺少允许重复但已排序的单个值集合类型。

您可以使用
列表。Sort
,LINQ在这种情况下不起作用,因为您无法在枚举期间修改字典(例如添加
或使用
属性):

foreach(var kv in yourSortedDictionary)
{
    kv.Value.Sort((p1, p2) => {
        int diff = p1.LastName.CompareTo(p2.LastName);
        if(diff != 0) return diff;
        return p1.FirstName.CompareTo(p2.FirstName);
    });
}
即使最好先添加一个已排序的列表,这种方法也能起作用


但正如我在评论中已经提到的,如果列表不能包含重复项,您可以使用a而不是
列表
。NET仍然缺少允许重复但已排序的单个值集合类型。

您可以使用
列表。Sort
,LINQ在这种情况下不起作用,因为您无法在枚举期间修改字典(例如添加
或使用
属性):

foreach(var kv in yourSortedDictionary)
{
    kv.Value.Sort((p1, p2) => {
        int diff = p1.LastName.CompareTo(p2.LastName);
        if(diff != 0) return diff;
        return p1.FirstName.CompareTo(p2.FirstName);
    });
}
即使最好先添加一个已排序的列表,这种方法也能起作用


但正如我在评论中已经提到的,如果列表不能包含重复项,您可以使用a而不是
列表
。NET仍然缺少允许重复但已排序的单值集合类型。

通常,我会创建一个新的IEnumerable,而不是尝试更改现有集合。(这是Linq的做法):

IEnumerable元组。创建(
x=>x.键,
x=>x.Value.OrderBy(x=>x.LastName).ThenBy(x=>x.FirstName));
你也可以把它放到字典里,但可能不需要。您可能希望对其进行排序(列表不够)或按键访问(不需要对其进行排序,在本例中使用ToDictionary)


当您在最后对字典进行排序(并向查询中添加另一个OrderBy)时,您可能甚至不需要将已排序字典作为源。

通常,我会创建一个新的IEnumerable,而不是尝试更改现有集合。(这是Linq的做法):

IEnumerable元组。创建(
x=>x.键,
x=>x.Value.OrderBy(x=>x.LastName).ThenBy(x=>x.FirstName));
你也可以把它放到字典里,但可能不需要。您可能希望对其进行排序(列表不够)或按键访问(不需要对其进行排序,在本例中使用ToDictionary)


当您在最后对字典进行排序(并向查询中添加另一个OrderBy)时,您可能甚至不需要将已排序字典作为源。

通常,我会创建一个新的IEnumerable,而不是尝试更改现有集合。(这是Linq的做法):

IEnumerable元组。创建(
x=>x.键,
x=>x.Value.OrderBy(x=>x.LastName).ThenBy(x=>x.FirstName));
你也可以把它放到字典里,但可能不需要。您可能希望对其进行排序(列表不够)或按键访问(不需要对其进行排序,在本例中使用ToDictionary)


当您在最后对字典进行排序(并向查询中添加另一个OrderBy)时,您可能甚至不需要将已排序字典作为源。

通常,我会创建一个新的IEnumerable,而不是尝试更改现有集合。(这是Linq的做法):

IEnumerable元组。创建(
x=>x.键,
x=>x.Value.OrderBy(x=>x.LastName).ThenBy(x=>x.FirstName));
你也可以把它放到字典里,但可能不需要。您可能希望对其进行排序(列表不够)或按键访问(不需要对其进行排序,在本例中使用ToDictionary)


当您在最后对其进行排序(并向查询中添加另一个OrderBy)时,您甚至可能不需要将已排序字典作为源。

我遇到了类似的难题,通过在foreach(…)语句中将包含对象的字典作为动态值进行排序,解决了这个问题

以下是我是如何做到这一点的一个示例../考虑到最初的场景

public class Person
  {
    private string firstName;
    private string lastName;  
    ...
  }

...
Dictionary<string, Person> dictPersons = new Dictionary<string, Person>();
// statements to populate the dictionary with keys and a Person objects.
....
foreach(var personEntry in dictPersons.ORderBy(p => p.Value.lastName).ThenBy(p => p.Value.firstName)
  {
  ...
  // When you use the firtName or lastName properties,just refer to it as:
  Console.WriteLine("LastName: {0}  FirstName: {1}", personEntry.Value.lastName, personEntry.Value.firstName);
  ...
}
公共类人物
{
私有字符串名;
私有字符串lastName;
...
}
...
Dictionary dictPersons=新字典();
//语句使用键和Person对象填充字典。
....
foreach(dictPersons.ORderBy中的var personEntry(p=>p.Value.lastName)。然后by(p=>p.Value.firstName)
{
...
//使用firtName或lastName属性时,只需将其称为:
WriteLine(“LastName:{0}FirstName:{1}”,perso