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