Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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# 通过将以某个字母开头的单词放在开头,对字符串列表进行排序_C#_Linq_List - Fatal编程技术网

C# 通过将以某个字母开头的单词放在开头,对字符串列表进行排序

C# 通过将以某个字母开头的单词放在开头,对字符串列表进行排序,c#,linq,list,C#,Linq,List,假设我有以下清单: IList<string> list = new List<string>(); list.Add("Mouse"); list.Add("Dinner"); list.Add("House"); list.Add("Out"); list.Add("Phone"); list.Add("Hat"); list.Add("Ounce"); 我提出了以下建议,但不起作用: list.Where(x => x.Contains("ou"))

假设我有以下清单:

IList<string> list = new List<string>();
list.Add("Mouse");
list.Add("Dinner");
list.Add("House");
list.Add("Out");
list.Add("Phone");
list.Add("Hat");
list.Add("Ounce");
我提出了以下建议,但不起作用:

list.Where(x => x.Contains("ou"))
    .OrderBy(x => x.StartsWith("ou"))
    .Select(x => x);
三个问题:

  • 您需要将结果分配给某个对象,否则它将被简单地丢弃
  • 您需要使用
    OrderByDescending
    ,因为如果使用
    OrderBy
    ,则
    true
    false
    之后排序
  • 您需要使用不区分大小写的比较
试试这个:

var needle = "ou";
var stringComparison = StringComparison.OrdinalIgnoreCase;

var query =
    from word in list
    let index = word.IndexOf(needle, stringComparison)
    where index != -1
    orderby index
    select word;

您将获得区分大小写的比较,并且还需要
OrderByDescending()
。实现大小写不敏感的一种快速而肮脏的方法是
ToLowerInvariant()

实例:

显示了进行不区分大小写比较的正确方法(即,不要使用上面的示例,它很糟糕)

或者使用列表的方法(将IList更改为List):


您的第一个错误是没有以不区分大小写的方式比较字符串;“Out”和“Ounce”具有大写Os,在使用Contains(“ou”)时不会返回“true”。解决方法是在检查字母时使用ToLower()

list.Where(x => x.ToLower().Contains("ou"))
    .OrderByDescending(x => x.ToLower.StartsWith("ou")) //true is greater than false.
    .Select(x => x);

这将在以“OU”开头的单词的开头添加一个空格


我想这就是你想要的:

list = list.Where(x => x.IndexOf("ou", StringComparison.OrdinalIgnoreCase) >= 0)
            .OrderByDescending(x => x.StartsWith("ou", StringComparison.OrdinalIgnoreCase))
            .ThenBy(x => x)
            .ToList();
请注意,我使用
StringComparison
enum(当前为
OrdinalIgnoreCase
)而不是将字符串转换为lower(或upper)。这确保了它在任何文化中都能始终如一地发挥作用。根据您的环境选择正确的不区分大小写的比较

如果您更喜欢LINQ查询语法,则:

list = (from x in list
        where x.IndexOf("ou", StringComparison.OrdinalIgnoreCase) >= 0
        orderby x.StartsWith("ou", StringComparison.OrdinalIgnoreCase) descending, x
        select x).ToList();

您只需按如下方式传入自定义比较器的实例,即可调用
list.Sort
方法:

public class MyCustomStringComparer: IComparer<string>  
{  
    public int Compare(Entity x, Entity y)  
    {  
        int result = 0;

        if (x.ToLower().StartsWith("ou") && y.ToLower().StartsWith("ou"))  
            result = x.Compare(y);  
        else if (x.ToLower().StartsWith("ou") && !y.ToLower().StartsWith("ou"))  
            result = -1;  
        else if (!x.ToLower().StartsWith("ou") && y.ToLower().StartsWith("ou"))  
            result = 1;  
        else  
            result = x.Compare(y);  

        return (result);  
    }  
}
公共类MyCustomStringComparer:IComparer
{  
公共整数比较(实体x、实体y)
{  
int结果=0;
如果(x.ToLower().StartsWith(“ou”)和y.ToLower().StartsWith(“ou”))
结果=x。比较(y);
else if(x.ToLower().StartsWith(“ou”)和&!y.ToLower().StartsWith(“ou”))
结果=-1;
如果(!x.ToLower().StartsWith(“ou”)和&y.ToLower().StartsWith(“ou”)),则为else
结果=1;
其他的
结果=x。比较(y);
返回(结果);
}  
}
var bla=“ou”;
变量列表=新列表{
“鼠标”,
“晚餐”,
“房子”,
“出去”,
“电话”,
“帽子”,
“盎司”};
var groupa=list.GroupBy(x=>x.ToLower().Contains(bla));
groupa.First().ToList().OrderByDescending(x=>x.ToLower().StartsWith(bla));

“它不起作用”:你能更精确一点吗?会发生什么?你在哪里分配结果?还是你认为,
OrderBy
改变了列表?@各位,你们到底为什么要按降序排列?下降是一个很长的词!!!只需添加
在此之前,它将被反转!当我说不工作时,我应该说明什么也没有发生。原来这是因为区分大小写的缘故,我本应该遵守这一点,但我一直在关注我以前从未使用过的StartsWith()方法。@YoryeNathan-为什么我要按与我试图做的相反的顺序进行排序,仅仅因为这意味着键入一些额外的键?这简直是胡说八道。@Jamiec按相反顺序排序就像是相反的重新排序。你只需重新排列相反句子的单词,意思就会以不同的顺序变得相反,但顺序不变。你明白了吗?(哈)。我的观点是-这不是胡说-这只是一个不同的观点。它的
OrderByDescending
不是
OrderByDesc
。有很多很好的答案,但这似乎是最全面的。谢谢大家,现在正在按预期工作。只是一些示例代码,我知道我必须为某些内容赋值。但要注意它的其余部分。将代码段落缩进4个空格,形成一个“代码段落”。所以人们喜欢格式良好的代码。
list.Where(x => x.ToLower().Contains("ou"))
    .OrderByDescending(x => x.ToLower.StartsWith("ou")) //true is greater than false.
    .Select(x => x);
var result = list.Where(x => x.ToLowerInvariant().Contains("ou"))
                 .OrderBy(x => x.ToLowerInvariant()
                                .StartsWith("ou") ? " " + x : x.Trim());
list = list.Where(x => x.IndexOf("ou", StringComparison.OrdinalIgnoreCase) >= 0)
            .OrderByDescending(x => x.StartsWith("ou", StringComparison.OrdinalIgnoreCase))
            .ThenBy(x => x)
            .ToList();
list = (from x in list
        where x.IndexOf("ou", StringComparison.OrdinalIgnoreCase) >= 0
        orderby x.StartsWith("ou", StringComparison.OrdinalIgnoreCase) descending, x
        select x).ToList();
public class MyCustomStringComparer: IComparer<string>  
{  
    public int Compare(Entity x, Entity y)  
    {  
        int result = 0;

        if (x.ToLower().StartsWith("ou") && y.ToLower().StartsWith("ou"))  
            result = x.Compare(y);  
        else if (x.ToLower().StartsWith("ou") && !y.ToLower().StartsWith("ou"))  
            result = -1;  
        else if (!x.ToLower().StartsWith("ou") && y.ToLower().StartsWith("ou"))  
            result = 1;  
        else  
            result = x.Compare(y);  

        return (result);  
    }  
}
var bla = "ou";

var list = new List<string>{
            "Mouse",
            "Dinner",
            "House",
            "Out",
            "Phone",
            "Hat",
            "Ounce"};


var groupa = list.GroupBy(x =>x.ToLower().Contains(bla));

groupa.First().ToList().OrderByDescending(x => x.ToLower().StartsWith(bla));