6

これは簡単な作業のようですが、LINQ でこれを行う方法がわかりません。これまでに見つけた唯一の情報は、ラウンド ロビン トーナメント形式に関するもので、これは私が求めているものではありません。私の探し方が悪いのかもしれません。次のリストがあるとします。

var items [] { "apple", "banana", "banana", "candy", "banana", "fruit", "apple" };

これを(できればlinqを使用して)「ラウンドロビン」の順序で並べ替えるにはどうすればよいですか。つまり、繰り返す前に各一意のアイテムを1回選択します。したがって、上記のリストは次のようになります (アルファベット順であるかどうかは重要ではありませんが、このリストはそうです):

var sorted [] { "apple", "banana", "candy", "fruit", "apple", "banana", "banana" };

難しい方法で反復することでこれを実行できることはわかっていますが、もっと簡単なことを望んでいました。誰もこれを行う方法について洞察を持っていますか? 前もって感謝します!

4

3 に答える 3

10
var sorted = items.GroupBy(s => s)
    .SelectMany(grp => grp.Select((str, idx) => new { Index = idx, Value = str }))
    .OrderBy(v => v.Index).ThenBy(v => v.Value)
    .Select(v => v.Value)
    .ToArray();
于 2012-05-28T11:34:05.923 に答える
0

私はこれを一度行い、コードを掘り下げました:

//Originially written for lists, all you need is prepend a .ToList() where needed to apply this to an array
List<string> src = new List<string> { "string1", "string2" }; //source
List<string> dst = new List<string>();

dst.AddRange(src.Distinct());
dst.ForEach(d => src.RemoveAt(src.FindIndex(i => i.Equals(d)))); //remove the first occurrence of each distinct element
dst.AddRange(src);
于 2012-05-28T11:34:15.640 に答える
0

これを書いているときに、2 つの回答が表示されたのを見ました。まあ、ここに別の方法があります:

var items [] { "apple", "banana", "banana", "candy", "banana", "fruit", "apple" };

var uniqueItems = items.Distinct().OrderBy(item => item); // alphabetical orderBy is optional

var duplicateItems = items
                     .GroupBy(item => item)
                     .SelectMany(group => group.Skip(1))
                     .OrderBy(item => item); // alphabetical orderBy is optional;

var sorted = uniqueItems.Append( duplicateItems ).ToArray();
于 2012-05-28T11:58:08.043 に答える