LINQ按字母排序,具有不同的值

时间:2012-11-24 22:39:16

标签: linq list lambda

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

已经排序列表=

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; 

是我提出的不太好的方法

1 个答案:

答案 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