我需要一个不区分大小写的列表或集合类型的集合(字符串).创建一个最简单的方法是什么?您可以指定要在Dictionary的键上获得的比较类型,但我找不到任何类似的List.
我想在txt文件中找到一个字符串,如果字符串比较,它应该继续读取行,直到我用作参数的另一个字符串.
例:
CustomerEN //search for this string
...
some text wich has details about customer
id "123456"
username "rootuser"
...
CustomerCh //get text till this string
Run Code Online (Sandbox Code Playgroud)
我需要细节与他们合作.
我正在使用linq来搜索"CustomerEN",如下所示:
File.ReadLines(pathToTextFile).Any(line => line.Contains("CustomerEN"))
Run Code Online (Sandbox Code Playgroud)
但现在我仍然坚持阅读行(数据)直到"CustomerCh"来提取细节.
假设我有2个字符串.第一个字符串是x ="abc",第二个字符串是y ="ABC".当我在c#中写下代码:
if(x == y)
Run Code Online (Sandbox Code Playgroud)
要么
if(x.Equals(y))
Run Code Online (Sandbox Code Playgroud)
返回值为true.如何查看大小写?
我有以下代码
var returnData = DemoData.Books.AsQueryable();
if (criteria.Author != string.Empty)
{
returnData = returnData.Where(x => x.Author.Contains(criteria.Author));
}
Run Code Online (Sandbox Code Playgroud)
如何使where子句不区分大小写?
寻找一种方法来检查一个字符串是否包含在另一个忽略大写/小写的情况下,我发现它:
工作良好.然后,我尝试将它放到我的StringExtensions命名空间.
namespace StringExtensions
{
public static class StringExtensionsClass
{
//...
public static bool Contains(this string target, string toCheck, StringComparison comp)
{
return target.IndexOf(toCheck, comp) >= 0;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后:
using StringExtensions;
...
if (".. a".Contains("A", StringComparison.OrdinalIgnoreCase))
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
方法'Contains'没有重载需要'2'参数
我如何解决它?
编辑2:
确认我的性能问题是由于对StringExtensions类的静态函数调用造成的.一旦删除,IndexOf方法确实是实现此目的的最快方法.
查看字符串是否包含C#中的另一个字符串的最快,不区分大小写的方法是什么?我在这里看到了Case不敏感的'Contains(string)'这个帖子的公认解决方案,但是我已经做了一些初步的基准测试,看起来使用该方法会导致在测试时对较大的字符串(> 100个字符)调用较慢的数量级无法找到字符串.
以下是我所知道的方法:
指数:
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
if (string.IsNullOrEmpty(toCheck) || string.IsNullOrEmpty(source))
return false;
return source.IndexOf(toCheck, comp) >= 0;
}
Run Code Online (Sandbox Code Playgroud)
ToUpper的:
source.ToUpper().Contains(toCheck.ToUpper());
Run Code Online (Sandbox Code Playgroud)
正则表达式:
bool contains = Regex.Match("StRiNG to search", "string", RegexOptions.IgnoreCase).Success;
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,这实际上是平均最快的方式,为什么呢?
编辑:
这是我用来突出性能差异的简单测试应用程序.使用它,我看到ToLower()为16 ms,ToUpper为18 ms,StringExtensions.Contains()为140 ms:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
namespace ScratchConsole
{
class Program
{
static void Main(string[] args)
{
string input = "";
while (input != "exit")
{
RunTest();
input …Run Code Online (Sandbox Code Playgroud) 我正在使用以下代码比较两个字符串
string1.Contains(字符串2)
但我没有得到不区分大小写搜索的结果.此外,我不能使用String.Compare因为我不想匹配整个名称,因为名称非常大.我需要进行不区分大小写的搜索,搜索文本可以是String1包含的任何长度.
例如**************是名称.我在文本框中输入"erm",我得到了结果.但当我输入"期限"时,我得不到任何结果.谁能帮我 :)
我正在对元素列表进行排序:
var matchEle = listOfElements.Where(e => e.Properties().Any(p => p.Name.Contains("Key", Asking for IEqualityComparer))).First();
Run Code Online (Sandbox Code Playgroud)
我习惯于直接使用 StringComparer、OrdinalIgnoreCase 或 CurrentCultureIgnoreCase,但是在这种情况下调用 Contains() 时,它会要求使用 IEqualityComparer。我想是因为数据结构/级别。我看到了如何设置 IEqualityComparer 的示例,例如
strEqualityComparer = new IEqualityComparer();
Run Code Online (Sandbox Code Playgroud)
并为 strEqualityComparer 定义类,但我不确定除此之外。有人可以帮助我让 linq 语句处理忽略案例吗?
更新:我很清楚这是数据结构的示例:
listOfElements = [element1, element2, etc..]
element1.Properties = ["Prop1", "Key1", "Prop2", "Key2", etc.]
Run Code Online (Sandbox Code Playgroud)
如果其任何属性具有包含关键字的值,我需要提取通过过滤器的元素,在本例中为“Key”,因此它不能是 .Equals 或 IndexOf。
所以我有一个Materiel-objects列表.在Materiel我有15个get和set方法.我想构建一个搜索方法,循环列表中的所有对象,以及每个Materiel对象中的所有变量.循环部分很容易,但我正在努力使用字符串包含部分.搜索词可以是例如"acto",我应该得到"Tractor"的命中.我已经尝试过使用string-Contains类,但据我所知,它只检查从位置0开始的字符串.所以"Tra"得到一个命中,但不是"acto".
课程中是否有任何构建,或者我应该自己编程?
对不起,解释不好.
我的代码.我现在看到我得到子串的命中,但也有其他结果:)
protected void Button_search_Click(object sender, EventArgs e)
{
string searchTerm = TextBox1.Text.ToString().ToLower();
TableRow row;
TableCell cell;
int rowNumber = 1;
foreach (Materiell mat in allItems)
{
if (searchTerm.Contains(mat.itemID.ToString().ToLower()) ||
searchTerm.Contains(mat.manufacturer.ToLower()) ||
searchTerm.Contains(mat.model.ToLower()) ||
searchTerm.Contains(mat.serialNo.ToLower()) ||
searchTerm.Contains(mat.dateProd.ToString().ToLower()) ||
searchTerm.Contains(mat.location.ToLower()) ||
searchTerm.Contains(mat.mainCategory.ToLower()) ||
searchTerm.Contains(mat.subCategory.ToLower()) ||
searchTerm.Contains(mat.dateAcquired.ToString().ToLower()) ||
searchTerm.Contains(mat.price.ToString().ToLower()) ||
searchTerm.Contains(mat.ownerID.ToString().ToLower()) ||
searchTerm.Contains(mat.extra.ToString().ToLower()) ||
searchTerm.Contains(mat.textComment.ToLower()) ||
searchTerm.Contains(mat.active.ToString().ToLower()))
{
row = new TableRow();
row.ID = "row" + rowNumber.ToString();
rowNumber++;
cell = new TableCell();
cell.Text = "<a href=\"#\" class=\"opendiv\">" + mat.itemID.ToString() + …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过搜索字符串过滤列表。它在蓝色笔记的文档中说:
Contains.IEnumerable 为您提供 .NET Framework 实现 ContainsToUpper应避免使用显式不区分大小写的调用,因为它会降低性能。我的过滤如下:
IQueryable<ApplicationUser> customers =
from u in _context.Users
where (u.Customer != null && u.IsActive)
select u;
if (!string.IsNullOrEmpty(searchString))
{
customers = customers.Where(s => s.Email.Contains(searchString));
}
Run Code Online (Sandbox Code Playgroud)
然而,这个解决方案区分大小写,我真的不明白为什么:因为我正在使用IQueryable,它应该使用数据库提供程序实现,默认情况下不区分大小写,对吧?
我正在使用 EF Core 2,目前只运行本地 MSSQLLocalDB。
c# ×9
string ×5
.net ×4
contains ×2
collections ×1
comparison ×1
linq ×1
overloading ×1
sql ×1