私は今2つのリストを持っています:
list<string> names;
list<int> numbers;
数字の値に基づいて名前を並べ替える必要があります。私は検索してきましたが、ほとんどが x.ID のようなものを使用していますが、その値が何であるかはよくわかりません。それでうまくいきませんでした。
誰かが知っている、何をすべきか、または ID 部分で私を助けることができますか?
したがって、両方のリストの要素がインデックスを介して関連付けられていると想定しています。
names.Select((n, index) => new { Name = n, Index = index })
.OrderBy(x => numbers.ElementAtOrDefault(x.Index))
.Select(x => x.Name)
.ToList();
Dictionary<int,string>
しかし、両方のリストがあまり関連していない場合は、代わりに別のコレクション型を使用します。
多分これはZip
メソッドのタスクです。何かのようなもの
names.Zip(numbers, (name, number) => new { name, number, })
2つのシーケンスを1つに「zip」します。そこから、次のようにシーケンスをすぐに注文できます。
.OrderBy(a => a.number)
Dictionary<,>
または、代わりに、のようにを作成できます
.ToDictionary(a => a.number, a => a.name)
しかし、あなたが本当に望んでいるのは、ハッシュコードで構成されたものではSortedDictionary<,>
なく、のように聞こえます。Dictionary<,>
並べ替えられた辞書を作成するためのLINQメソッドはありませんが、
var sorted = new SortedDictionary<int, string>();
foreach (var a in zipResultSequence)
sorted.Add(a.number, a.name);
または、を使用してSortedDictionary<,>
、Linqを完全にスキップし、次のようにします。
var sorted = new SortedDictionary<int, string>();
for (int idx = 0; idx < numbers.Count; ++idx) // supposing the two list have same Count
sorted.Add(numbers[idx], names[idx]);
辞書を使って修正しました。結果は次のとおりです。
dictionary.OrderBy(kv => kv.Value).Reverse().Select(kv => kv.Key).ToList();
Tims の回答を補完するために、カスタム データ構造を使用して 1 つの名前を番号に関連付けることもできます。
public class Person
{
public int Number { get; set; } // in this case you could also name it ID
public string Name { get; set; }
}
次に、 があり、List<Person> persons;
このリストを好きな属性で並べ替えることができます。
List<Person> persons = new List<Person>();
persons.Add(new Person(){Number = 10, Name = "John Doe"});
persons.Add(new Person(){Number = 3, Name = "Max Muster"});
// sort by number
persons = persons.OrderBy(p=>p.Number).ToList();
// alternative sorting method
persons.Sort((a,b) => a.Number-b.Number);