我有这个类结构:
List<myObject> myList = new List<myObject>();
myObject
{
List<myOtherObject> myOtherList = new List<myOtherObject>();
}
myOtherObject
{
string name;
}
按字母顺序打印names
中的所有myList
的最佳方法是什么?
我能做到这一点,但我怀疑有更有效的方法来实现同样的目标:
foreach(myObject a in myList)
{
foreach(myOtherObject b in a.myOtherList)
{
newList.Add(b.name);
}
}
//print newList alphabetically
编辑:
我能够更改结构,现在我只需要根据myOtherList
属性对name
进行排序。
我尝试过这样做,但它似乎没有排序:
myOtherList.OrderBy(obj=>obj.name);
是否对其进行了排序,还是需要将其分配到另一个列表?
答案 0 :(得分:2)
使用linq(方法表示法):
foreach (var result in myList
.SelectMany(l => l.myOtherList)
.OrderBy(obj => obj.Name))
{
Console.WriteLine(result.name);
}
这使myList
的{{1}}变为myOtherList
的平面列表。
答案 1 :(得分:1)
你可以很容易地用LINQ做到这一点:
var sortedResults = from other in myList
from item in other.myOtherList
orderby item.name
select item;
foreach (var result in sortedResults)
{
Console.WriteLine(result.name);
}
如果您需要对数据进行排序,那么您可能希望将List<myOtherObject>
更改为SortedList<string, myOtherObject>
,但我假设myOtherObject
是不可变的,因此自动排序无法获取损坏。
答案 2 :(得分:1)
按字母顺序打印列表中所有名称的最有效方法是从按字母顺序排序的列表开始。然后你只需按顺序打印它们。
虽然这样的答案可能看起来像是避免了解决方案,但如果要按顺序进行大量打印而不是添加项目,那么在插入时进行排序的List实现可能只是正确的答案。
任何其他解决方案都需要先对列表进行排序,或者生成列表的排序版本,除非您想对整个列表进行一些非常可怕的性能扫描,以确定要打印的“下一个最低”项目。 / p>