gpt4 book ai didi

c# - 不区分大小写比较字符串和非字符串

转载 作者:行者123 更新时间:2023-11-30 19:13:17 25 4
gpt4 key购买 nike

我创建了一个 C# 结构,它通常可以透明地处理不区分大小写的字符串比较。例如:

List<IString> list = new List<IString>();
list.Add("help");
Assert.IsTrue(list.Contains("Help"));

Dictionary<IString, string> dict = new Dictionary<IString, string>();
dict["Help"] = "thanks!";
Assert.AreEqual("thanks!", dict["hELP"]);

但是我无法弄清楚(也许不可能)的一件事是如何让类字符串在 .Equals(object) 中很好地发挥作用:

IString A1 = "A";
string A2 = "a";
Assert.AreEqual(A1, A2, "This passes");
Assert.AreEqual(A2, A1, "This fails");

代码如下:

using System;
using System.Collections.Generic;

namespace Util
{
/// <summary>
/// Case insensitive wrapper for the string class
/// </summary>
public struct IString :
IComparer<IString>,
IComparable,
IComparable<IString>,
IComparable<string>,
IEquatable<string>,
IEquatable<IString>
{
private const StringComparison icase = StringComparison.OrdinalIgnoreCase;

public readonly string Value;
public IString(string Value)
{
this.Value = Value;
}

public bool Equals(string Other)
{
return string.Equals(Value, Other, icase);
}
public bool Equals(IString Other)
{
return string.Equals(Value, Other.Value, icase);
}
public override bool Equals(object obj)
{
if (obj is IString || obj is string)
{
return string.Equals(Value, obj.ToString(), icase);
}
else
{
return false;
}
}

public int IndexOf(string Other)
{
return Other.IndexOf(Other, icase);
}
public bool Contains(string Other)
{
return IndexOf(Other) >= 0;
}

public override int GetHashCode()
{
if (Value == null)
return 0;
else
return StringComparer.OrdinalIgnoreCase.GetHashCode(Value);
}

public override string ToString()
{
return Value;
}

public int Compare(IString x, IString y)
{
return string.Compare(x.Value, y.Value, icase);
}
public int Compare(string x, string y)
{
return string.Compare(x, y, icase);
}

public int CompareTo(object obj)
{
if (obj is IString)
return Compare(this, (IString)obj);
else if (obj is string)
return Compare(Value, (string)obj);
else if (Value != null)
return Value.CompareTo(obj);
else
return -1;
}

public int CompareTo(IString other)
{
return Compare(this, other);
}

public int CompareTo(string other)
{
return Compare(Value, other);
}

public static implicit operator string(IString From)
{
return From.Value;
}
public static implicit operator IString(string From)
{
return new IString(From);
}

#region IString to IString operators
public static bool operator ==(IString Str1, IString Str2)
{
return string.Equals(Str1.Value, Str2.Value, icase);
}
public static bool operator !=(IString Str1, IString Str2)
{
return !string.Equals(Str1.Value, Str2.Value, icase);
}
public static IString operator +(IString Str1, IString Str2)
{
return (IString)(Str1.Value + Str2.Value);
}
public static bool operator >(IString Str1, IString Str2)
{
return Str1.CompareTo(Str2) > 0;
}
public static bool operator >=(IString Str1, IString Str2)
{
return Str1.CompareTo(Str2) >= 0;
}
public static bool operator <(IString Str1, IString Str2)
{
return Str1.CompareTo(Str2) < 0;
}
public static bool operator <=(IString Str1, IString Str2)
{
return Str1.CompareTo(Str2) <= 0;
}
#endregion IString to IString operators


#region string to IString operators
public static bool operator ==(string Str1, IString Str2)
{
return string.Equals(Str1, Str2.Value, icase);
}
public static bool operator !=(string Str1, IString Str2)
{
return !string.Equals(Str1, Str2.Value, icase);
}
public static IString operator +(string Str1, IString Str2)
{
return (IString)(Str1 + Str2.Value);
}
public static bool operator >(string Str1, IString Str2)
{
return Str2.CompareTo(Str1) < 0;
}
public static bool operator >=(string Str1, IString Str2)
{
return Str2.CompareTo(Str1) <= 0;
}
public static bool operator <(string Str1, IString Str2)
{
return Str2.CompareTo(Str1) > 0;
}
public static bool operator <=(string Str1, IString Str2)
{
return Str2.CompareTo(Str1) >= 0;
}
#endregion string to IString operators


#region IString to string operators
public static bool operator ==(IString Str1, string Str2)
{
return string.Equals(Str1.Value, Str2, icase);
}
public static bool operator !=(IString Str1, string Str2)
{
return !string.Equals(Str1.Value, Str2, icase);
}
public static IString operator +(IString Str1, string Str2)
{
return (IString)(Str1.Value + Str2);
}
public static bool operator >(IString Str1, string Str2)
{
return Str1.CompareTo(Str2) > 0;
}
public static bool operator >=(IString Str1, string Str2)
{
return Str1.CompareTo(Str2) >= 0;
}
public static bool operator <(IString Str1, string Str2)
{
return Str1.CompareTo(Str2) < 0;
}
public static bool operator <=(IString Str1, string Str2)
{
return Str1.CompareTo(Str2) <= 0;
}
#endregion IString to string operators

}
}

有什么方法可以让 string.Equal(object) 将 IString 作为字符串实际处理?

最佳答案

你不需要首先创建这样的类型。
相反,您应该使用 StringComparer 类。

例如:

var dict = new Dictionary<String, string>(StringComparer.OrdinalIgnoreCase);
dict["Help"] = "thanks!";
Assert.AreEqual("thanks!", dict["hELP"]);

或者

List<String> list = new List<String>();
list.Add("help");
Assert.IsTrue(list.Contains("Help", StringComparer.OrdinalIgnoreCase));

另请注意,它不应命名为IString;只有接口(interface)应该以 I 开头。

回答你的问题,不;那是不可能的。

关于c# - 不区分大小写比较字符串和非字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4207045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com