【问题标题】:Sort collection by another collection values按另一个集合值对集合进行排序
【发布时间】:2015-10-18 18:40:53
【问题描述】:

我有List<SomeData> data;

public class SomeData
{
    public int Key { get; set;}
    public decimal Value { get; set;}
}

我也有List<int> DataOrder;

我需要按KeyList<SomeData>data 进行排序,并将其与List<int> DataOrder 值的顺序相同。

有没有通用的算法呢?

例子:

List<SomeData> data = new List<SomeData>();
data.Add(new SomeData{ Key = 10, Value = 14 })
data.Add(new SomeData{ Key = 25, Value = 22 })
data.Add(new SomeData{ Key = 567, Value = 3 })
data.Add(new SomeData{ Key = 57, Value = 300 })
data.Add(new SomeData{ Key = 17, Value = 200 })
data.Add(new SomeData{ Key = 343, Value = 42 })

List<int> DataOrder = new List<int>{1, 25, 700, 567, 343, 350, 10};

排序后的结果:

foreach(var element in data)
{
     Console.WriteLine(element.Key);
}

输出:

25
567
343
10
57
17

编辑:初始data数组可以有Key,不包含在DataOrder中 这样的值应该以任何顺序放置在结果集合的末尾。 更改示例以说明它。

【问题讨论】:

  • 你能展示你的样本数据输入和预期输出吗?
  • SomeData 中 DataOrder 和 Keys 的大小如何,它们是否相等或可能相等?
  • 我添加了我需要的结果示例。

标签: c# .net sorting collections


【解决方案1】:

加盟怎么样:

var mySortedList = (from i in DataOrder
            join d in data on i equals d.Key
            select new SomeData 
            { 
                Key = d.Key, 
                Value = d.Value 
            });

编辑:要同时添加来自data 且在DataOrder-list 中不共享任何键的值,您只需将Union 添加到结果中,如下所示:

var result = mySortedList.Union(data.Where(x => !DataOrder.Contains(x.Key)));

【讨论】:

  • @EhsanSajjad 不要把你的缩进标准强加给别人;不是每个人的缩进方式都一样。
  • @HimBromBeere 很棒的解决方案,我的解决方案喜欢你的,但有些不同
【解决方案2】:
int count = 0;
for(int i in DataOrder)
{
    var index = data.IndexOf(d => d.Key == i);
    swap(data[count], data[index]);
    count++;
}

swap 函数用于交换物品的位置。

【讨论】:

    【解决方案3】:

    已解决

    public class SomeData
    {
        public int Key { get; set; }
        public decimal Value { get; set; }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            List<SomeData> orders = new List<SomeData>();
    
            orders.Add(new SomeData { Key = 10, Value = 14 });
            orders.Add(new SomeData { Key = 25, Value = 22 });
            orders.Add(new SomeData { Key = 567, Value = 3 });
            orders.Add(new SomeData { Key = 57, Value = 300 });
            orders.Add(new SomeData { Key = 17, Value = 200 });
            orders.Add(new SomeData { Key = 343, Value = 42 });
    
            List<int> ids = new List<int> { 1, 25, 700, 567, 343, 350, 10 };
    
            //get orders only from ids with order
            List<SomeData> existedOrders = (from order in orders
                                            join id in ids
                                                 on new { onlyId = order.Key }
                                                equals new { onlyId = id }
                                            orderby ids.IndexOf(id)
                                            select order).ToList();
    
            //add others
            existedOrders.AddRange(orders.Except(existedOrders).ToList());
    
        }
    }
    

    //使用@HimBromBeere 解决方案可以减少查询

    //get orders only from ids with order
    List<SomeData> existedOrders = (from order in orders
                                    join id in ids
                                         on order.Key equals id
                                    orderby ids.IndexOf(id)
                                    select order).ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 2017-05-02
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多