C#如何根据每个项中的字符子集使用lambda表达式对字符串列表进行排序
我有一个字符串列表,这些字符串是记录的名称。例如:C#如何根据每个项中的字符子集使用lambda表达式对字符串列表进行排序,c#,list,sorting,lambda,C#,List,Sorting,Lambda,我有一个字符串列表,这些字符串是记录的名称。例如: Record_One Record_Two Records_Three 有时,我想删除一条记录。出于录制目的,我不会删除该字符串。我通过在末尾添加“u Deleted”一词对其进行修改,如下所示: Record_One_Deleted Record_Two Record_Three_Deleted 我的问题是: 如何保持字符串列表按字母顺序排列,同时将所有已删除的记录放在底部 预期结果如下(使用新的示例数据集): 请注意,我的列表是按字母顺
Record_One
Record_Two
Records_Three
有时,我想删除一条记录。出于录制目的,我不会删除该字符串。我通过在末尾添加“u Deleted”一词对其进行修改,如下所示:
Record_One_Deleted
Record_Two
Record_Three_Deleted
我的问题是:
如何保持字符串列表按字母顺序排列,同时将所有已删除的记录放在底部
预期结果如下(使用新的示例数据集):
请注意,我的列表是按字母顺序排列的,但包含“\u Deleted”的字符串位于底部
我希望使用Lambda表达式,因为我已经可以使用如下内容按字母顺序排列列表:
A_List.Sort((x, y) => string.Compare(x.Name, y.Name));
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));
我发现一句话的表达相当圆滑
任何人如有任何想法或意见,将不胜感激 您可以将
OrderBy
与bool一起使用:
list.OrderBy(str => str.EndsWith("_Deleted"))
.ThenBy(str => str);
这里有一个演示:我的第一个想法是:
A_List.Where(li => !li.EndsWithd("_DELETED").ToList().Sort((x, y) => string.Compare(x.Name, y.Name));
但在本例中,列表中没有已删除的项目。您可以将它们保存在单独的列表中,然后将此列表添加到另一个列表中。您可以派生自己的列表,并将其传递给相应的重载
我相信这将比分类更有效,然后再细分
这样做的好处是可重用,并允许传递显式比较类型的最佳实践。您可能可以使用linq OrderBy扩展并执行以下操作:
A_List.Sort((x, y) => string.Compare(x.Name, y.Name));
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));
List strings=新列表()
{
“A”,
“B”,
“C_已删除”,
“E_已删除”,
“D”,
“C_已删除”,
};
var result=strings.OrderBy(i=>i.Replace(“_DELETED”,string.Empty));
您可以检查已删除的零件的x.名称和y.名称;如果其中一个有,另一个应该在列表的前面;如果两者都有或两者都没有,只需使用string.Compare。但是我只需要单独维护已删除记录的列表(不改变模型,可能只是它们的表示方式)。谢谢您的回复!我决定接受蒂姆的建议。更换是一个相对昂贵的手术。谢谢你花时间给我回复!这不是真的会把“\u Deleted”
行放在第一位吗,还是true
排在false
之后。这种方法可能适用于一次性排序。@Jodrell:将true
理解为1,将false
理解为0;-)如果您想先获得true
项,可以使用OrderByDescending
。我宁愿将其留给Comparer.Default
-这太棒了。谢谢蒂姆!那个演示网站真的很酷!我最终使用str.Contains而不是str.EndsWith,但从我所知道的情况来看,它的工作原理是相同的@mherr:EndsWith
如果总是在末尾,则更安全,而且效率更高一点(可以忽略不计)。感谢您花时间给出回复!谢谢你的回复!我决定同意蒂姆的建议,因为这是我一直在寻找的一种解决方案。不过,谢谢你提醒我使用这种方法比Tim的方法有潜在的好处。
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));