Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何按字典值对对象列表进行排序?_C#_Linq_Sorting_Lambda - Fatal编程技术网

C# 如何按字典值对对象列表进行排序?

C# 如何按字典值对对象列表进行排序?,c#,linq,sorting,lambda,C#,Linq,Sorting,Lambda,我将如何亲自按照选定的字典值对其进行排序 示例:“人员”的订单列表按“车辆”值递减 对于那些奇特的lambda/linq方程,这可能吗 public class People { List<Person> Persons { get; set; } } public class Person { public Dictionary<string, string> cars { get; set; } public Dictionary<

我将如何亲自按照选定的字典值对其进行排序

示例:“人员”的订单列表按“车辆”值递减

对于那些奇特的lambda/linq方程,这可能吗

public class People 
{
    List<Person> Persons { get; set; }
}

public class Person
{
    public Dictionary<string, string> cars { get; set; } 
    public Dictionary<string, string> houses { get; set; } 
    public Dictionary<string, string> banks { get; set; }
}

................

People people = new People();

people.Persons = new List<Person> 
{
    new Person 
    {
        cars = new Dictionary<string, string> { { "volvo", "340050" }, { "bmw", "50545000" } }, 
        houses = new Dictionary<string, string> { { "mansion", "100040000" },{ "cardboard box", "112" } },
        banks = new Dictionary<string, string> { { "swiss", "12500330000" }, { "camen", "12000000" } }
    }, 
    new Person 
    {
        cars = new Dictionary<string, string> { { "volvo", "34023200" }, { "bmw", "5003300" } }, 
        houses = new Dictionary<string, string> { { "mansion", "1000330000" },{ "cardboard box", "277" } },
        banks = new Dictionary<string, string> { { "swiss", "12500044000" }, { "camen", "12000000" } }
    }, 
    new Person 
    {
        cars = new Dictionary<string, string> { { "volvo", "3554000" }, { "bmw", "50023200" } }, 
        houses = new Dictionary<string, string> { { "mansion", "1006600000" },{ "cardboard box", "244" } },
        banks = new Dictionary<string, string> { { "swiss", "125000544000" }, { "camen", "12000777000" } }
    }
};
公共阶层人士
{
列出人员{get;set;}
}
公共阶层人士
{
公共字典{get;set;}
公共词典库{get;set;}
公共字典库{get;set;}
}
................
人=新人();
people.peoples=新列表
{
新人
{
汽车=新字典{{“沃尔沃”,“340050”},{“宝马”,“50545000”},
houses=新字典{{“大厦”,“100040000”},{“纸板箱”,“112”},
班克斯=新词典{{“瑞士”、“12500330000”}、{“卡门”、“12000000”}
}, 
新人
{
汽车=新字典{{“沃尔沃”,“34023200”},{“宝马”,“5003300”},
houses=新字典{{“大厦”,“1000330000”},{“纸板箱”,“277”},
班克斯=新词典{{“瑞士”、“12500044000”}、{“卡门”、“12000000”}
}, 
新人
{
汽车=新字典{{“沃尔沃”,“3554000”},{“宝马”,“50023200”},
houses=新字典{{“大厦”,“1006600000”},{“纸板箱”,“244”},
班克斯=新词典{{“瑞士”、“125000544000”}、{“卡门”、“12000777000”}
}
};
编辑/示例结果:

结果是根据每个人的字典中包含的值生成一个新的或重新排序的列表

个人->汽车->{“沃尔沃”,“34023200”}
个人->汽车->{“沃尔沃”,“3554000”}
个人->汽车->{“沃尔沃”,“340050”}

新的或重新排序的列表将与此完全相同:

people.Persons = new List<Person> 
{
    new Person 
    {
        cars = new Dictionary<string, string> { { "volvo", "34023200" }, { "bmw", "5003300" } }, 
        houses = new Dictionary<string, string> { { "mansion", "1000330000" },{ "cardboard box", "277" } },
        banks = new Dictionary<string, string> { { "swiss", "12500044000" }, { "camen", "12000000" } }
    },
    new Person 
    {
        cars = new Dictionary<string, string> { { "volvo", "3554000" }, { "bmw", "50023200" } }, 
        houses = new Dictionary<string, string> { { "mansion", "1006600000" },{ "cardboard box", "244" } },
        banks = new Dictionary<string, string> { { "swiss", "125000544000" }, { "camen", "12000777000" } }
    },
    new Person 
    {
        cars = new Dictionary<string, string> { { "volvo", "340050" }, { "bmw", "50545000" } }, 
        houses = new Dictionary<string, string> { { "mansion", "100040000" },{ "cardboard box", "112" } },
        banks = new Dictionary<string, string> { { "swiss", "12500330000" }, { "camen", "12000000" } }
    }
};
people.Persons=新列表
{
新人
{
汽车=新字典{{“沃尔沃”,“34023200”},{“宝马”,“5003300”},
houses=新字典{{“大厦”,“1000330000”},{“纸板箱”,“277”},
班克斯=新词典{{“瑞士”、“12500044000”}、{“卡门”、“12000000”}
},
新人
{
汽车=新字典{{“沃尔沃”,“3554000”},{“宝马”,“50023200”},
houses=新字典{{“大厦”,“1006600000”},{“纸板箱”,“244”},
班克斯=新词典{{“瑞士”、“125000544000”}、{“卡门”、“12000777000”}
},
新人
{
汽车=新字典{{“沃尔沃”,“340050”},{“宝马”,“50545000”},
houses=新字典{{“大厦”,“100040000”},{“纸板箱”,“112”},
班克斯=新词典{{“瑞士”、“12500330000”}、{“卡门”、“12000000”}
}
};

如果您指的是按个人拥有的汽车数量排序

var result = Person.OrderByDescending(x => x.cars.Count);
var result = Person.OrderByDescending(x => x.cars.Keys.OrderBy(y => y.Key).FirstOrDefault());
var result = Person.OrderByDescending(x => x.cars.Keys.OrderBy(y => y.value).FirstOrDefault());
如果您的意思是按此人拥有的第一辆(按名称排序)汽车名称排序

var result = Person.OrderByDescending(x => x.cars.Count);
var result = Person.OrderByDescending(x => x.cars.Keys.OrderBy(y => y.Key).FirstOrDefault());
var result = Person.OrderByDescending(x => x.cars.Keys.OrderBy(y => y.value).FirstOrDefault());
如果您的意思是按此人拥有的第一个(按编号排序)车号排序

var result = Person.OrderByDescending(x => x.cars.Count);
var result = Person.OrderByDescending(x => x.cars.Keys.OrderBy(y => y.Key).FirstOrDefault());
var result = Person.OrderByDescending(x => x.cars.Keys.OrderBy(y => y.value).FirstOrDefault());
一个示例输出可以很好地阐明您实际想要按什么排序,因为cars是一个列表,而不仅仅是一个元素


根据您提供的示例,这可能正好为您完成以下工作:

var result = Person.OrderByDescending(x => x.cars.Values.FirstOrDefault());

这里有一个妙计;基本上,字典可以看作是KeyValuePair对象的列表

Dictionary myDictionary=newdictionary();
foreach(myDictionary中的变量项)
//item是一个KeyValuePair,按插入字典的顺序枚举
现在它已经在一个列表中,通过LINQ很容易排序:

Dictionary<int, string> sample = new Dictionary<int, string>
{
   { 1, "Sample" },
   { 2, "Another Sample" }
};

var orderedList = sample.OrderBy(x => x.Value).ToList();
字典示例=新字典
{
{1,“样本”},
{2,“另一个样本”}
};
var orderedList=sample.OrderBy(x=>x.Value.ToList();
当然,更大的问题是为什么需要对字典进行排序和排序——这并不是一个真正与字典概念相结合的操作(它更适合通过指定键快速访问特定元素)。你写的问题描述似乎很奇怪;您可以为特定的人订购汽车,但您是否试图从按价值订购的每个人那里查找每辆汽车

这也很容易做到:

List<PersonCarDetails> allStuff = new List<PersonCarDetails>();

foreach(var person in persons)
   allStuff.AddRange(person.Cars.Select(x => new PersonCarDetails { PersonId = person.Id, CarName = x.Key, CarId = x.Value }).ToList());

 // allStuff now contains a list of PersonCarDetails, and then you can order that:

 var orderedList = allStuff.OrderBy(x => x.CarId).ToList();
List allStuff=new List();
foreach(var个人对个人)
allStuff.AddRange(person.Cars.Select(x=>newpersoncardetails{PersonId=person.Id,CarName=x.Key,CarId=x.Value}).ToList();
//allStuff现在包含一个PersonCarDetails列表,然后您可以订购:
var orderedList=allStuff.OrderBy(x=>x.CarId.ToList();

汽车是什么意思?汽车名称?每个人都有一本汽车及其价值的字典。我怎样才能把每个人按这个分类?按什么分类?您有字典、键或值吗?抱歉,我现在要添加一些示例输出。我在解释我的问题时遇到了困难。我不想订购字典。我的意思是按每个人的字典值对列表进行排序。您将如何选择字典中的哪个元素进行排序?例如,你说的是将人1与人2进行比较。你在比较第1个人汽车字典的哪个部分和第2个人汽车字典的哪个部分?字典不是有序的数据集合。我可以访问如下列表
foreach(Person.Persons中的Person p){string carValue=p.car[“volvo”];}
。字典不是有序的集合,而是列表。我只想按每个人的字典值对所有人进行排序。我在前面的问题区域中添加了一个示例输出。如果要按所需的字典元素对人员列表进行排序,可以这样做
var people=people.Persons.OrderBy(x=>x.Cars.First(kv=>kv.Key==“volvo”).Value)
。请注意,如果此人的汽车字典中没有值为“volvo”的钥匙,则此代码将被炸成碎片。根据请求添加了示例输出。现在再看看你的例子。谢谢