我的C#代码中有一个“标题”对象的字典:Dictionary<long, Title> DAllTitles
使用Title类定义如下:
class Title
{
public long TitleID { get; set;}
public string TitleText { get; set;}
public string TitleNumber { get; set;}
}
“ TitleNumber”可以具有以下值,例如:“ 1”,“ 1.1”,“ 2.10”,“ 4.6.5.2.5”等...将来可能会有更多的数字。
如何从字典DAllTitles中获得按“ TitleNumber”属性排序的字典或标题列表?我想不出一个简单的解决方案...
谢谢!
答案 0 :(得分:0)
您可以使用chefao帮助程序功能:
{'name': ['d', 'c', 'a', 'e', 'b'], 'c1': [2, 1, 0, 0, 0], 'c2': [1, 2, 3, 2, 0], 'c3': [4, 3, 1, 5, 2]}
然后用linq排序:
string padded(string s)
{
var p = s.Split('.');
var pp = string.Join("." , p.Select(x => Convert.ToInt16(x).ToString("00000")));
return pp;
}
有些linq艺术家甚至可以将所有内容合而为一,但不是我;-)
请注意,我省略了所有检查!您也可以在函数中跳过一行,直接返回并选择字符串格式的最大位数。
输入(稍作修改的类):
List<Title> sorted = DAllTitles.OrderBy(x => padded(x.TitleNumber)).ToList();
输出:
var DAllTitles = new List<Title>()
{
new Title("1.20"),new Title("1.2"),new Title("1.11"),new Title("1.1"),new Title("1.1.1")
,new Title("1.1.0"),new Title("1.1.3")
};
答案 1 :(得分:0)
可以实施以更正确地控制版本控制的类。
public class TitleNumber : IComparable
{
private int[] Version;
public TitleNumber(string titlenumber)
{
Version = titlenumber.Split('.').Select(x => int.Parse(x)).ToArray();
}
public int CompareTo(object obj)
{
if (obj is TitleNumber other)
{
return CompareTo(other);
}
else
{
throw new ArgumentException($"Object must be of type {nameof(TitleNumber)}");
}
}
public int CompareTo(TitleNumber other)
{
var depth = 0;
var depthThis = Version.Length - 1;
var depthOther = other.Version.Length - 1;
while (true)
{
if (depthThis == depth && depthOther == depth) return 0;
if (depthOther < depth || (depthThis >= depth && Version[depth] > other.Version[depth])) return 1;
if (depthThis < depth || Version[depth] < other.Version[depth]) return -1;
depth++;
}
}
public override bool Equals(object obj) => obj is TitleNumber other && CompareTo(other) == 0;
public override string ToString() => string.Join(".", Version);
}
举例说明如何使用它:
var t1 = new TitleNumber("5.34.20");
var t2 = new TitleNumber("4");
var t3 = new TitleNumber("5.34");
var t4 = new TitleNumber("5.34.20.1");
var t5 = new TitleNumber("5.35");
var l = new List<TitleNumber>() { t1, t2, t3, t4, t5 };
var r = l.OrderBy(x => x).ToList();
答案 2 :(得分:-1)
我不确定我是否了解要对订购逻辑应用哪些规则,但是LINQ对我来说可以满足您的要求。
dico.OrderBy(kvp => kvp.Value.TitleNumber).ToDictionary(kvp => kvp.Key);
那将以某种方式对字典进行排序,我毫不怀疑您可以根据需要对其进行调整。