可能重复:
不同的字符串比较方法有什么区别
以下哪两个更有效?(或者可能还有第三种选择更好吗?)
string val = "AStringValue";
if (val.Equals("astringvalue", StringComparison.InvariantCultureIgnoreCase))
Run Code Online (Sandbox Code Playgroud)
要么
if (val.ToLowerCase() == "astringvalue")
Run Code Online (Sandbox Code Playgroud)
?
可能重复:
C#中字符串比较方法的差异
在.NET中有许多字符串比较方法,我只是想确认哪一个是最好的考虑性能.
string.Equals()
string.Compare()
string.CompareTo()
string.CompareOrdinal()
string.ReferenceEquals()
if (str1 == str2)
Run Code Online (Sandbox Code Playgroud) 从未来的这个问题,我不知道为什么ä和ae是不同的(这是有道理的),但ß并ss视为相等.即使这个问题似乎是相关的,我也没有找到答案,甚至提到"这ß将与SS德国或类似的相提并论",但不是为什么.
我发现MSDN上唯一的资源是:如何:比较字符串
这里提到以下但也缺乏原因:
// "They dance in the street."
// Linguistically (in Windows), "ss" is equal to
// the German essetz: 'ß' character in both en-US and de-DE cultures.
.....
Run Code Online (Sandbox Code Playgroud)
那么,为什么要true对de-DE文化或任何其他文化进行评估:
var ci = new CultureInfo("de-DE");
int result = ci.CompareInfo.Compare("strasse", "straße", CompareOptions.IgnoreNonSpace); // 0
bool equals = String.Equals("strasse", "straße", StringComparison.CurrentCulture); // true
equals = String.Equals("strasse", …Run Code Online (Sandbox Code Playgroud) 我想知道,在比较C#中的字符串时?哪种方法适合使用,为什么?
CompareTo()还是Equals()?
我想使用字符串类的Equals()方法比较C#中两个字符串是否相等.但即使两个字符串相同,我的条件检查也会失败.
我已经看到两个字符串相同,并在http://text-compare.com/网站上验证了这一点.我不知道这里有什么问题......
我的代码是:
protected string getInnerParaOnly(DocumentFormat.OpenXml.Wordprocessing.Paragraph currPara, string paraText)
{
string currInnerText = "";
bool isChildRun = false;
XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(currPara.OuterXml);
XmlNode newNode = xDoc.DocumentElement;
string temp = currPara.OuterXml.ToString().Trim();
XmlNodeList pNode = xDoc.GetElementsByTagName("w:p");
for (int i = 0; i < pNode.Count; i++)
{
if (i == 0)
{
XmlNodeList childList = pNode[i].ChildNodes;
foreach (XmlNode xNode in childList)
{
if (xNode.Name == "w:r")
{
XmlNodeList childList1 = xNode.ChildNodes;
foreach (XmlNode xNode1 in childList1)
{
if (xNode1.Name …Run Code Online (Sandbox Code Playgroud) 我有一个字符串比较问题 - 在大多数情况下 - 表现得如预期的那样,但是由于我的代码没有将字符串对检测为重复,因此留下了大量重复数据库插入.
我以为我把它缩小到一个文化问题(西里尔字符),我解决了,但我现在得到'假阴性'(两个显然相等的字符串显示为不相等).
我查看了以下类似的问题,并尝试了以下比较方法.
我检查的类似SO问题:
以下是比较字符串的示例:(标题和说明)
饲料标题:埃尔斯伯格:他是英雄
饲料设计:丹尼尔埃尔斯伯格告诉美国有线电视新闻网的唐柠檬,国家安全局的骗子爱德华斯诺登表现出了勇气,做了大量的服务.
db title: Ellsberg:他是英雄
db desc:丹尼尔埃尔斯伯格告诉美国有线电视新闻网的唐柠檬,国家安全局的骗子爱德华斯诺登表现出勇气,做了大量的服务.
我的应用程序将从RSS提要获取的值与我在数据库中提供的值进行比较,并且只应插入"新"值.
//fetch existing articles from DB for the current feed:
List<Article> thisFeedArticles = (from ar in entities.Items
where (ar.ItemTypeId == (int)Enums.ItemType.Article) && ar.ParentId == feed.FeedId
&& ar.DatePublished > datelimit
select new Article
{
Title = ar.Title,
Description = ar.Blurb
}).ToList();
Run Code Online (Sandbox Code Playgroud)
以下比较的每个人都显示与Ellsberg标题/描述不匹配.ie matches1 to matches6都有Count()==0
(请原谅列举的变量名称 - 它们仅用于测试)
// comparison methods
CompareOptions compareOptions = CompareOptions.OrdinalIgnoreCase;
CompareOptions compareOptions2 …Run Code Online (Sandbox Code Playgroud) 具体来说有什么区别
String.Compare(String, String, StringComparison) 和String.Compare(String, String, CultureInfo, CompareOptions)我觉得第二个提供了更多的选项(比较使用任何文化,而不是只有当前的一个或不变的,忽略特殊字符,忽略katakanas(!!)等的宽度...)比第一个.两者都已经在.NET 2.0中引入了它,所以我猜它不能成为向后兼容的问题.
那么有什么区别,什么时候应该使用第一个?什么时候应该使用第二个?
检查下面的更新3 我发现我遇到的问题与.Net 4.0,4.0客户端和4.5的c#字符串比较器的已知严重问题有关,这将导致字符串列表的排序顺序不一致(导致输出依赖在输入的顺序和使用的排序算法).该问题于2012年12月向微软报告,并以"不会修复"结束.可以使用一种解决方法,但速度慢得多,对于大型集合来说几乎不实用.
在实现不可变的PatriciaTrie时,我想将其性能与System.Collections.Generic.SortedList进行比较.我使用以下文件https://github.com/rkapsi/patricia-trie/blob/master/src/test/resources/org/ardverk/collection/hamlet.txt来创建用于测试的输入词表.
当使用Comparer<string>.Default或StringComparer.InvariantCulture作为密钥比较器插入c#SortedList中的每个单词时,使用常规搜索方法无法检索成功插入的多个条目(例如,ContainsKey返回false),但密钥在列表中显示为通过迭代列表观察.
更奇怪的是,比较器在将从排序列表中检索到的密钥与无法找到的搜索密钥进行比较时返回值"0" ContainsKey.
下面的完整示例演示了我的系统上的这个问题.
using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// the problem is possibly related to comparison.
var fail = true;
var comparer = fail ? StringComparer.InvariantCulture : StringComparer.Ordinal;
// read hamlet (contains duplicate words)
var words = File
.ReadAllLines("hamlet.txt")
.SelectMany(l => l.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries))
.Select(w => w.Trim())
.Where(w => !string.IsNullOrEmpty(w))
.Distinct(comparer) …Run Code Online (Sandbox Code Playgroud) 我需要将一些字符串比较从vb转换为c#.vb代码使用>和<运算符.我希望用标准的框架字符串比较方法替换它.但是,有一种我不理解的行为.为了复制这个,我有这个测试
[TestMethod]
public void TestMethod2()
{
string originalCulture = CultureInfo.CurrentCulture.Name; // en-GB
var a = "d".CompareTo("t"); // returns -1
var b = "T".CompareTo("t"); // returns 1
Assert.IsTrue(a < 0, "Case 1");
Assert.IsTrue(b <= 0, "Case 2");
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么b返回1.我目前的理解是,如果它区分大小写,那么"T"应该在排序顺序中的"t"之前,即-1.如果它不区分大小写,它将是相同的,即0
(仅供参考.Net Framework 4.5.2)
很多thx
在 C# 中,String.CompareOrdinal(strA, strB)相当于String.Compare(strA, strB, StringComparison.Ordinal)?
我检查了https://msdn.microsoft.com/en-us/library/e6883c06.aspx上的文档,它没有提到这一点。