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”的字符串位于底部。

我希望使用 Lambda 表达式,因为我已经可以使用以下方式对列表进行字母排序:

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

而且我发现单行表达式相当流畅。

任何想法或评论都非常感谢任何可能拥有它们的人!

4

4 回答 4

9

您可以使用OrderBy布尔值:

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

您也许可以使用 linq OrderBy Extension 并执行以下操作:

 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 回答