c# - 按另一个集合值对集合进行排序

标签 c# .net sorting collections

我有List<SomeData> data;

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

我还有List<int> DataOrder;

我需要排序List<SomeData>data通过Key ,将其按照与 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 
            });

编辑:要同时添加 data 中不共享 DataOrder 列表中任何键的值,您只需添加一个 Union结果如下:

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

关于c# - 按另一个集合值对集合进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31672401/

相关文章:

c# - 从URL在asp.net网站上播放youtube视频

c# - 将新行添加到表后如何更新 datagridview 的行列表

c# - .NET 上的 Apache NMS 无法连接到 ActiveMQ [ channel 处于非事件状态太长时间]

python - 组合列表中的项目

c# - 使用非管理员用户访问Windows容器内的Docker主机管道

c# - 在 Xamarin Forms 中选择存储文件的路径

java - 基于多个参数构建排序列表?

algorithm - 使用有限的堆栈操作进行排序

c# - 双缓冲 C#

c# - .NET IsValidXml 扩展方法性能