我有一个数据列表集合,例如:
List<String> Dummy = new List<String>()
{
"1001A",
"1003A",
"1002B",
"1002A",
"1003B",
"1001B",
"1003C",
"1002C",
"1001C",
};
我想将此数据列表整理成系列。主要系列将重点关注Alphabet(字符串的最后一个字符),子系列将基于左边的数字。输出将是这样的:
1001A
1002A
1003A
1001B
1002B
1003B
1001C
1002C
1003C
除了上面的示例之外,我已经只有一系列数字的功能代码。感谢阅读我的帖子。
答案 0 :(得分:7)
var result = Dummy
.OrderBy(p => p[p.Length - 1])
.ThenBy(p => p.Substring(0, p.Length - 1));
这将首先按字符串的最后一个字符排序,然后按字符串的最后一个字符除外。
如果所有字符串都具有相同的长度,您也可以将最后一部分保留在.ThenBy(p => p)
,因为字符串已经按最后一个字符排序。如果字符串长度不同,则需要在我的代码中使用子字符串。
答案 1 :(得分:2)
如果字符串有可能具有不同的长度,则需要以下内容。
var result = data.OrderBy(d => d[d.Length - 1])
.ThenBy(d => int.Parse(d.Substring(0, d.Length - 1])));
您当然需要防止可能使用错误数据解析异常。
这假设你想要“200A”来到“1000A”之前。
答案 2 :(得分:1)
版本a)(最快)
使用内置的Sort方法(就地排序),使用自定义Comparision委托/ lambda
dummy.Sort((s1, s2) =>
{
// TODO: Handle null values, now supposing s1 and s2 are not null
// TODO: Handle variable length if needed. Supposing fixed 4+1 data
var result = s1[4].CompareTo(s2[4]);
if (result != 0)
{
return result;
}
return s1.Substring(0, 4).CompareTo(s2.Substring(0, 4));
});
要重用Comparision,您可以将其编写为静态方法而不是内联lambda,但是我建议这样做以实现IComparator。 (Sort方法有一个接受IComparator的重载)
版本b):
使用LINQ:
// TODO: Handle variable length if needed, supposing fixed 4+1 data structure:
var orderedList = dummy.OrderBy(s => s[4]).ThenBy(s => s.SubString(0,4).ToList();
答案 3 :(得分:1)
基于分组的解决方案:
var res = Dummy.GroupBy(str => str.Last()).OrderBy(g => g.Key)
.SelectMany(g => g.OrderBy(str => str.Substring(0, str.Length - 1)))
.ToList();