我想以这种方式对已排序的列表进行排序。
已经排序列表=
Ali-23423423423
Ali-234234
Ali-234234255
Bali-36365356
Bali-32326546456
Bali-361111
Tali1-234234
Tali2-2342342
Tali3-23424
我正在尝试查找查询,以便我可以像这样对其进行排序
Ali-12315254
Bali-23346363
Tali-242452345
Ali-2342134134
Bali-234234234
Tali-242342
等等。
我为这项工作制作了一个循环,但它非常缓慢,而且有些问题也是如此。有没有解决方案?
while (List1.Count+10 < List.Count)
{
i++;
if (List.ElementAt(i).Remove(List.ElementAt(i).IndexOf('-')) == List1.ElementAt(i + 1).Remove(List1.ElementAt(i + 1).IndexOf('-')))
{
String Element = List.ElementAt(i);
List.RemoveAt(i);
List.Add(Element);
i--;
}
else
{
List1.Add(List.ElementAt(i));
}
}
List = List1;
是我提出的不太好的方法
答案 0 :(得分:2)
此查询将按名称为您提供唯一项目
var query = from s in list
let name = s.Split('-')[0]
group s by name into g
orderby g.Key // don't sure if you need ordering
select g.First();
UPDATE 我认为这段代码完全符合您的要求 - 首先选择每个名称的第一次出现,然后选择第二次出现等等
List<string> sortedList = new List<string>();
while (list.Any())
{
var query = list.GroupBy(s => s.Split('-')[0], (k,g) => g.First()).ToList();
// list.RemoveAll(s => query.Contains(s));
query.ForEach(s => list.Remove(s)); // I think this is more effective
sortedList.AddRange(query);
}
您的样本数据的输出是:
Ali-23423423423 // first loop
Bali-36365356
Tali1-234234
Tali2-2342342
Tali3-23424
Ali-234234 // second loop
Bali-32326546456
Ali-234234255 // third loop
Bali-361111