Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#如何根据每个项中的字符子集使用lambda表达式对字符串列表进行排序_C#_List_Sorting_Lambda - Fatal编程技术网

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));