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

更新このコードはあなたが望むことを正確に実行すると思います-すべての名前の最初の出現のみが最初に選択され、次に2番目の出現が選択されます、など

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 に答える