我有5个清单。一个是发布日期,其他是该列表的属性,但是分成多个列表。
List<string> sortedDateList = x1.OrderBy(x => x).ToList();
此代码首先按照最早的日期对列表进行排序。但我也想对其他属性列表进行排序(同步),因为它们需要与日期相同的索引。
我怎么能意识到这一点?我是Linq-methods的新手。
答案 0 :(得分:4)
您可以使用.Zip()方法按照here所述组合列表。您可以将它们组合成一个类或匿名类型,然后然后对它们进行排序。
int[] numbers = { 1, 2, 3, 4 };
string[] words = { "one", "two", "three" };
var numbersAndWords = numbers.Zip(words, (first, second) => new { Num = first, Word = second });
var sorted = numbersAndWords.OrderBy(x => x.Num).ToList();
或者,如果您保证所有列表的长度相同(或只是获取最短列表),您可以使用以下代码而不是.Zip()扩展名。
var numbersAndWords = numbers.Select((number, i) => new { Num = number, Word = words[i], Foo = myFoos[i] }); // Where myFoos is another collection.
在lambda中,通过索引访问集合,将来自单独列表的所有项目同时组合到一个对象中。 (避免多次使用.Zip())当然,如果您尝试访问大于列表大小的索引,您将获得IndexOutOfRangeException
。
答案 1 :(得分:4)
据我了解您的问题,您有不同的列表,其中包含某些对象的属性。您绝对应该考虑将所有数据存储到您正在制作的类的一个列表中,您可以将所有单独的信息合并到一个对象中:
var list = new List<YourClass>
{
new YourClass
{
Date = ...,
OtherProperty = ...,
},
new YourClass
{
Date = ...,
OtherProperty = ...,
},
};
var ordered = list.OrderBy(o => o.Date);
但是如果你坚持在他们自己的列表中存储不同的属性,那么你可以选择带有索引的日期,然后对其进行排序,如C# Sorting list by another list中所述:
var orderedDates = list.Select((n, index) => new { Date = n, Index = index })
.OrderBy(x => x.Date)
.ToList();
然后,您可以使用已排序对象的索引按索引查找其他列表中的属性,或按索引对其进行排序,如C# Sort list while also returning the original index positions?,Sorting a list and figuring out the index中所述,等等。
答案 2 :(得分:2)
这听起来好像你想要一个班级列表。
public class MyClass{
public string Date{get; set;} //DateTime is a better type to use for dates by the way
public string Value2{get; set;}
public string Value3{get; set;}
public string Value4{get; set;}
public string Value5{get; set;}
}
...
var sortedDateList = x1.OrderBy(x => x.Date).ToList()
答案 3 :(得分:2)
创建一个包含日期和属性的对象:
writeDocType()
答案 4 :(得分:0)
如果要将列表分开,和/或将订购的版本创建为单独的列表,则可以将索引连接到日期并按日期排序,然后使用排序的索引:
var orderedIndexedDateOfReleases = dateOfReleases.Select((d, i) => new { d, i }).OrderBy(di => di.d);
var orderedDateOfReleases = orderedIndexedDateOfReleases.Select(di => di.d).ToList();
var orderedMovieNames = orderedIndexedDateOfReleases.Select(di => movieNames[di.i]).ToList();
如果您不介意将结果合并,您可以创建一个类或使用匿名类,然后按日期排序:
var orderedTogether = dateOfReleases.Select((d, i) => new { dateOfRelease = d, movieName = movieNames[i] }).OrderBy(g => g.dateOfRelease).ToList();