2017-04-25 22 views
4

現在、頻繁なシーケンスを生成するコードを実装しようとしています。私はmyList.Sort()を使用しようとしました文字列リストの辞書順ソートリスト

myList = {{"a","b","c"},{"a","b","d"}}; 

しかし:私は必要な出力がある

List<List<string>> myList = new List<List<string>>(); 
List<string> input1 = new List<string>() {"a", "b", "d"}; 
List<string> input2 = new List<string>() {"a", "b", "c"}; 
myList.Add(input1); 
myList.Add(input2); 

:そうすることで、私は次のように文字列のリストのリストのインプレースの並べ替えを取得する必要がありますそれはSystem.InvalidOperationExceptionを提起した。 LINQではそれほど良くありませんので、私はこの種のものを何も使用していません。

+0

スタック・トレースおよびラインはおそらく役立つだろう使用することができます。 –

答えて

2

myList = myList.OrderBy(s => string.Join(string.Empty, s)).ToList(); 

トリックは子リストの各要素の連結によって作られた文字列に応じて並べ替えることです。

1

あなたはSort()を解決したい場合は、そうでなければ、私は単一stringにすべての項目をconcartenateし、それらを比較します

myList.Sort((x, y) => x.Zip(y,(l1,l2) => string.Compare(l1,l2)).FirstOrDefault(c => c != 0)); 

このアプローチを使用することができます。

これは、文字列オブジェクトを最初に作成する必要があるため、効率が低下します。

myList = myList.OrderBy(string.Concat).ToList(); 

サンプル:https://dotnetfiddle.net/1VmohIについてどのように

0

あなたは、コードの下に試すことができます。

 List<string> input1 = new List<string>() { "a", "b", "d" }; 
     List<string> input2 = new List<string>() { "a", "b", "c" }; 

     //Instead of adding input as List<string>, add it as string 
     string delimiter = ","; 
     var input1Str = input1.Aggregate((i, j) => i + delimiter + j); 
     var input2Str = input2.Aggregate((i, j) => i + delimiter + j); 

     var myListStr = new List<string>(); 
     myListStr.Add(input1Str); 
     myListStr.Add(input2Str); 

     myListStr.Sort(); 
     //Now you can convert it into List<List<string>> 
     List<List<string>> myList = myListStr.Select(x => x.Split(',').ToList()).ToList(); 
0

ます。また、例外が発生し

myList = myList.OrderBy(arr => arr[0]) 
       .ThenBy(arr => arr[1]) 
       .ThenBy(arr => arr[2]) 
       .ToList(); 
関連する問題