【问题标题】:Sort List<T> with an array使用数组对 List<T> 进行排序
【发布时间】:2014-04-29 12:46:40
【问题描述】:

基本上我有一个包含所有项目的列表。然后我有一个字符串,其中包含我想从列表中获取的 ID,为此我将字符串拆分为一个 Int 数组,然后使用它和 LINQ 从列表中获取我想要的项目

像这样:

List<T> lstAllList = Model.getAllItems();

string stringIDs = "8,9,12,11,7";

int[] intArray = stringIDs.Split(',').Select(n => Convert.ToInt32(n)).ToArray();

List<T> lstLimitedList = (from r in lstAllList where intArray.Contains(r.id) select r).ToList();

效果很好。

但这里的问题是我希望我的列表以与 ID 字符串相同的方式排序,即 8,9,12,11,7 就像在这个例子中一样。 但是LINQ返回的列表默认是按照id排序的,所以返回的列表是7,8,9,11,12。

有没有办法防止它像这样对它进行排序,或者有没有办法用我的 int 数组对新列表进行排序?

【问题讨论】:

    标签: c# arrays linq list sorting


    【解决方案1】:

    当然,只要按照数组中ID的索引排序即可:

    string stringIDs = "8,9,12,11,7";
    
    int[] intArray = stringIDs.Split(',').Select(n => Convert.ToInt32(n)).ToArray();
    
    var lstLimitedList = (
            from r in lstAllList 
            where intArray.Contains(r.id) 
            orderby Array.IndexOf(intArray, r.id)   // <--------
            select r).ToList();
    

    【讨论】:

    • 嗯,这比预期的要容易。当它可用时将接受答案。谢谢!
    【解决方案2】:

    一次只获取一个元素可能比尝试求助更快。 (有人愿意计算 O() 成本吗?)

    List<T> lstLimitedList = new List<T>();
    
    foreach(int id in intArray)
    {
        lstLimitedList.Add(lstAllList.Where(item => item.id = id));
    }
    

    如果您是 LINQ 狂热者,也可以使用 intArray.ForEach(),但这更容易阅读。 ;)

    【讨论】:

      【解决方案3】:

      尝试轮换您的查询。在单词 rotate 下,我的意思是从 intArray 开始并使用 join。像这样的:

      List<T> lstLimitedList = (
      from id in intArray 
      join item in lstAllList on id equals item.Id 
      select item).ToList();
      

      【讨论】:

        【解决方案4】:

        使用 LINQ 提供的 intersect 扩展方法!

        int[] array ={ 8,9,12,11,7} // or your result from your split on string;
        List<int> array2 = new List<int> { 8,9,12,11,7 } // your model.GetAllItems;
        
        // Call Intersect extension method.
        var intersect = array.Intersect(array2);
        // Write intersection to screen.
        foreach (int value in intersect)
        {
            Console.WriteLine(value); // Output: 8,9,12,11,7 
        }
        

        对我来说有点清洁

        【讨论】:

          【解决方案5】:

          停止过度使用 LINQ。在这种情况下,linq 完全是矫枉过正。下面是一个更简单、性能更好的解决方案:

          string a = "8,9,12,11,7";
          
          List<int> list = new List<int>();
          
          string[] splitted = a.Split(',');
          for (int i = 0; i < splitted.Length; i++)
          {
              list.Add(int.Parse(splitted[i]));
          }
          

          哪个单循环,没有排序等。

          【讨论】:

          • 所以你甚至不会保护你的 -1 对抗这个工作简单的解决方案?
          • 最终结果应该是Ts 的列表(无论是什么),而不是ints 的列表。
          • OP 正在尝试根据其数组中值的顺序进行排序。您首先提供了一种获取数组的替代方法。您还没有回答问题。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-09-21
          • 1970-01-01
          • 2019-07-02
          • 1970-01-01
          • 2010-10-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多