C#List.OrderBy有多个列表

时间:2017-09-12 16:34:39

标签: c# list linq

我有5个清单。一个是发布日期,其他是该列表的属性,但是分成多个列表。

List<string> sortedDateList = x1.OrderBy(x => x).ToList();

此代码首先按照最早的日期对列表进行排序。但我也想对其他属性列表进行排序(同步),因为它们需要与日期相同的索引。

我怎么能意识到这一点?我是Linq-methods的新手。

5 个答案:

答案 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();