![](/img/trans.png)
[英]How do I prepend every item in a list of strings in C# with a Lambda Expression
[英]C# How to sort a List of Strings using lambda expression depending upon a subset of characters inside each item
我有一个字符串列表,它们是记录的名称。 一个例子:
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 Expression,因为我已经可以使用以下内容按字母顺序排列列表:
A_List.Sort((x, y) => string.Compare(x.Name, y.Name));
我发现一行表达式相当光滑。
任何可能拥有它们的人都非常感谢任何想法或评论!
您可以将OrderBy
与bool一起使用:
list.OrderBy(str => str.EndsWith("_Deleted"))
.ThenBy(str => str);
这是一个演示: http : //ideone.com/m6Zgd
您可以派生自己的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));
这具有可重用的优点,并允许传递显式比较类型的最佳实践。
我的第一个想法是:
A_List.Where(li => !li.EndsWithd("_DELETED").ToList().Sort((x, y) => string.Compare(x.Name, y.Name));
但在此示例中,您没有列表中的已删除项目。 您可以将它们保存在单独的列表中,然后将此列表添加到另一个列表中。
您也许可以使用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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.