2

レコードの名前である文字列のリストがあります。例:

Record_One
Record_Two
Records_Three

レコードを削除したい場合があります。録音のために、文字列は削除しません。次のように、末尾に_Deletedという単語を追加して変更します。

Record_One_Deleted
Record_Two
Record_Three_Deleted

私の質問はこれです:

すべての_Deletedレコードを一番下に配置しながら、文字列のリストをアルファベット順に保持するにはどうすればよいですか?

意図した結果は次のようになります(新しいサンプルデータセットを使用)。

B
C
D
E
A_Deleted
F_Deleted

私のリストはアルファベット順ですが、「_Deleted」を含む文字列が一番下にあることに注意してください。

ラムダ式を使用したいのは、次のようなものを使用してリストをアルファベット順に並べ替えることができるためです。

A_List.Sort((x, y) => string.Compare(x.Name, y.Name));

そして、私は一行の表現がかなり滑らかであると思います。

どんな考えやコメントも、それらを持っているかもしれない誰にでも大いに感謝されます!

4

4 に答える 4

9

OrderByboolで使用できます:

list.OrderBy(str => str.EndsWith("_Deleted"))
    .ThenBy(str => str);

これがデモです:http://ideone.com/m6Zgd

于 2012-10-16T13:27:23.553 に答える
2

あなたはあなた自身Comparer<string>を導き出し、それを適切なOrderBy過負荷に渡すことができます。

これは、ソートしてからサブソートするよりも効率的だと思います。


public DeletedLastStringComparer : Comparer<string>
{
    private const string Deleted = "_Deleted";

    private readonly stringComparison;

    public DeletedLastStringComparer() :
        this DeletedLastStringComparer(StringComparison.InvariantCulture)
    {
    }

    public DeletedLastStringComparer(StringComparison stringComparison)
    {
        this.stringComparison;
    }

    public override int Compare(string x, string y)
    {
        var xDeleted = x.EndsWith(Deleted, this.stringComparison);
        var yDeleted = y.EndsWith(Deleted, this.stringComparison);

        if (xDeleted ^ yDeleted)
        {
            if (xDeleted)
            {
                return -1;
            }

            return 1;
        }
        else
        {
            return string.Compare(x, y, this.stringComparison);
        }
    }
}

このように使用できます

list.OrderBy(s => s, new DeletedLastStringComparer(StringComparison.Ordinal));

これには、再利用可能であり、明示的な比較タイプを渡すベストプラクティスを可能にするという利点があります。

于 2012-10-16T13:35:22.350 に答える
0

私の最初のアイデアは次のようになります。

A_List.Where(li => !li.EndsWithd("_DELETED").ToList().Sort((x, y) => string.Compare(x.Name, y.Name));

ただし、この例では、リストに削除されたアイテムはありません。それらを別のリストに保存し、後でこのリストを他のリストに追加することができます。

于 2012-10-16T13:28:54.837 に答える
0

おそらくlinqOrderByExtensionを使用して、次のようなことを行うことができます。

 List<string> strings = new List<string>()
            {
                "A",
                "B",
                "C_DELETED",
                "E_DELETED",
                "D",
                "C_DELETED",
            };

 var result = strings.OrderBy(i => i.Replace("_DELETED", string.Empty));
于 2012-10-16T13:49:56.827 に答える