【问题标题】:C# List.OrderBy with multiple lists具有多个列表的 C# List.OrderBy
【发布时间】:2017-09-12 16:34:38
【问题描述】:

我有 5 个列表。一个包含发布日期,其他是该列表的属性,但分隔在多个列表中。

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

此代码按最旧日期对列表进行排序,就像它应该的那样。但我也想对其他属性列表进行排序(同步),因为它们需要与日期相同的索引。

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

【问题讨论】:

  • 您的其他列表是如何定义的?
  • 为什么不存储具有属性的对象列表,而不是每个属性的列表?
  • 你可以在调用.ToList()之前添加.ThenBy()方法
  • 我真的很喜欢 Linq,但是如果您将新方法添加到您的 x1 列表中,可能会更容易。 SortAll 或某事。它在内部处理您的方法。所以你可以调用 x1.SortAll。在内部您可以一个一个地订购。

标签: c# list linq


【解决方案1】:

您可以使用 .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

【讨论】:

  • 是的,但他们有 五个 列表。当然你可以 Zip() 把它们全部压缩,但这很快就会变得非常笨拙。
  • @CodeCaster +1 我同意,这就是为什么我提出了按索引访问的建议。我看你也有同样的想法! ;)
【解决方案2】:

据我了解您的问题,您有不同的列表,其中包含某些对象的属性。您绝对应该考虑将所有数据存储到您制作的类的一个列表中,将所有单独的信息合并到一个对象中:

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 等中的说明按索引对它们进行排序。

【讨论】:

    【解决方案3】:

    听起来你几乎想要一个类的列表。

    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()
    

    【讨论】:

      【解决方案4】:

      创建一个包含日期和属性的对象:

      public class DateWithAttributes
      {
        public string Date {get;set;}
        public Attribute Attribute1 {get;set;}
        public Attribute Attribute2 {get;set;}
      ...
      }
      
      List<DateWithAttributes> DateWithAttributesList = new List<DateWithAttributes>()
      {
        DateWithAttribute1,
        DateWithAttribute2
      }
      List<DateWithAttributes> sortedDateList = DateWithAttributesList.OrderBy(x => x.date).ToList();
      

      【讨论】:

        【解决方案5】:

        如果您想将列表分开,和/或将有序版本创建为单独的列表,那么您可以将索引连接到日期并按日期排序,然后使用排序索引:

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

        【讨论】:

          猜你喜欢
          • 2016-05-14
          • 1970-01-01
          • 2011-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-19
          • 1970-01-01
          • 2012-04-12
          相关资源
          最近更新 更多