-1

我想以这种方式对已经排序的列表进行排序。

已排序列表 =

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; 

是不是我想出的不太好的方法

4

1 回答 1

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();

更新我认为这段代码完全符合您的要求 - 首先选择每个名称的第一次出现,然后选择第二次出现,等等

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
于 2012-11-24T22:43:00.103 回答