C# 如何比较这两个字符串
我有一个关于如何比较两个字符串的问题 这是代码C# 如何比较这两个字符串,c#,sql,C#,Sql,我有一个关于如何比较两个字符串的问题 这是代码 string stringA = "This is a test item"; string stringB = "item test a is This"; 显然,stringB包含stringA中的每个单词,但顺序不同 我期望的结果应该是真实的 我的问题是,我该怎么办?我尝试使用.Contains()方法,但结果为FALSE 谢谢大家 更新 谢谢大家的友好回复 以下是我的澄清 实际上,我正在使用LINQ和EF构
string stringA = "This is a test item";
string stringB = "item test a is This";
显然,stringB包含stringA中的每个单词,但顺序不同
我期望的结果应该是真实的
我的问题是,我该怎么办?我尝试使用.Contains()方法,但结果为FALSE
谢谢大家
更新
谢谢大家的友好回复
以下是我的澄清
实际上,我正在使用LINQ和EF构建一个数据库搜索功能
假设一个项目的名称为“这是一个测试项目”
如果用户输入“test a is this”,我希望函数足够智能,能够捕获上面提到的项目
有什么建议吗
另一次更新
再次感谢你的帮助
我确实喜欢彼得·里奇、codesparkle、戴夫和埃德弗雷德的建议。试试这种方法:
- 将每个字符串中的每个单词放入字符串数组中
- 按字母顺序对每个单词数组排序
- 比较数组是否相等
- 将每个字符串中的每个单词放入字符串数组中
- 按字母顺序对每个单词数组排序
- 比较数组是否相等
stringA.Split(' ').OrderBy(w => w).SequenceEqual(stringB.Split(' ').OrderBy(w => w));
编辑
哎呀。错误的方法。那会教我回答得太快
我认为这应该是可行的:
stringA.Split(' ').OrderBy(w => w).SequenceEqual(stringB.Split(' ').OrderBy(w => w));
我将进行两阶段比较:
Michael G.我将进行两阶段比较:
Michael G.您可以在空白处拆分字符串并比较两个结果集合。您可以从linq使用: 如果第一个字符串中的单词位于集合words1中,而第二个字符串中的单词位于words2中,则可以执行以下操作:
if(!words1.Intersect(words2).Except( words1).Any()) -> your sentences are 'equal'
您可以在空白处拆分字符串并比较两个结果集合。您可以从linq使用: 如果第一个字符串中的单词位于集合words1中,而第二个字符串中的单词位于words2中,则可以执行以下操作:
if(!words1.Intersect(words2).Except( words1).Any()) -> your sentences are 'equal'
“String.Split”用空格分隔符分隔单词,将结果数组排序到列表中,然后比较列表。例如:
var x = new List<string>(stringA.Split(' '));
x.Sort();
var y = new List<string>(stringB.Split(' '));
y.Sort();
bool areEqual = x.SequenceEqual(y);
var x=新列表(stringA.Split(“”));
x、 排序();
变量y=新列表(stringB.Split(“”));
y、 排序();
bool areEqual=x.SequenceEqual(y);
更新如果不区分大小写:
var x = new List<string>(stringA.Split(' '));
x.Sort();
var y = new List<string>(stringB.Split(' '));
y.Sort();
bool areEqual = x.SequenceEqual(y, StringComparer.OrdinalIgnoreCase);
var x=新列表(stringA.Split(“”));
x、 排序();
变量y=新列表(stringB.Split(“”));
y、 排序();
bool areEqual=x.SequenceEqual(y,StringComparer.OrdinalIgnoreCase);
但是,如果要查找将在SQL Server中执行的内容,则可能需要其他内容。'String.Split'使用空格分隔符拆分单词,将生成的数组排序到列表中,然后比较列表。例如:
var x = new List<string>(stringA.Split(' '));
x.Sort();
var y = new List<string>(stringB.Split(' '));
y.Sort();
bool areEqual = x.SequenceEqual(y);
var x=新列表(stringA.Split(“”));
x、 排序();
变量y=新列表(stringB.Split(“”));
y、 排序();
bool areEqual=x.SequenceEqual(y);
更新如果不区分大小写:
var x = new List<string>(stringA.Split(' '));
x.Sort();
var y = new List<string>(stringB.Split(' '));
y.Sort();
bool areEqual = x.SequenceEqual(y, StringComparer.OrdinalIgnoreCase);
var x=新列表(stringA.Split(“”));
x、 排序();
变量y=新列表(stringB.Split(“”));
y、 排序();
bool areEqual=x.SequenceEqual(y,StringComparer.OrdinalIgnoreCase);
但是,如果您正在寻找将在SQL Server中执行的内容,则可能需要其他内容。我会将字符串拆分为标记,并测试stringA中的所有标记是否都存在于stringB的标记列表中。比如:
var stringBTokens = stringB.Split(" ");
foreach(string token in stringA.Split(" "))
{
if(stringBTokens.Contains(token) == false) return false;
}
return true;
可能有一些奇怪的正则表达式可以做到这一点,但这是一个相当直接的测试。如果您想获得更多乐趣,可以使用Linq Any方法,如下所示:
var stringBTokens = stringB.Split(" ");
return !stringBTokens.Any(token => stringA.Contains(token));
这基本上是做同样的事情,只是后者我觉得更优雅一点。我希望没有错误,我使用的是macbook pro,没有安装任何与.net相关的(或mono等)来验证这一点
更新
string stringA = "This is a test item";
string stringB = "item test a is This";
string stringC = "Not the Same is This";
bool result = stringA.ContainsSameWordsAs(stringB); // true
bool different = stringA.ContainsSameWordsAs(stringC); // false
根据你的澄清,我想看看
这听起来像是你想要达到的目标。我以前创建这些标记是为了在数据库中进行快速文本搜索,它非常有效。我会将字符串拆分为标记,并测试stringA中的所有标记是否都存在于stringB的标记列表中。比如:
var stringBTokens = stringB.Split(" ");
foreach(string token in stringA.Split(" "))
{
if(stringBTokens.Contains(token) == false) return false;
}
return true;
可能有一些奇怪的正则表达式可以做到这一点,但这是一个相当直接的测试。如果您想获得更多乐趣,可以使用Linq Any方法,如下所示:
var stringBTokens = stringB.Split(" ");
return !stringBTokens.Any(token => stringA.Contains(token));
这基本上是做同样的事情,只是后者我觉得更优雅一点。我希望没有错误,我使用的是macbook pro,没有安装任何与.net相关的(或mono等)来验证这一点
更新
string stringA = "This is a test item";
string stringB = "item test a is This";
string stringC = "Not the Same is This";
bool result = stringA.ContainsSameWordsAs(stringB); // true
bool different = stringA.ContainsSameWordsAs(stringC); // false
根据你的澄清,我想看看
这听起来像是你想要达到的目标。我以前创建这些是为了在中进行快速文本搜索