簡體   English   中英

按另一個集合值對集合進行排序

[英]Sort collection by another collection values

我有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此類值應以任何順序放置在結果集合的末尾。 更改示例以說明它。

如何加入:

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

編輯:還可以從不共享DataOrder -list內任何鍵的data中添加那些值,您可以簡單地將Union添加到結果中,如下所示:

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

解決了

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();
int count = 0;
for(int i in DataOrder)
{
    var index = data.IndexOf(d => d.Key == i);
    swap(data[count], data[index]);
    count++;
}

交換功能用於交換項目的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM