假设我有这个char
数组:
private char[] _alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
.ToCharArray();
我想找到字符B
的索引,因此代码必须返回1。
我写了这个方法:
public int? GetCharIndex(string code)
{
return _alpha.FirstOrDefault(c => c.ToString() == code.ToUpper());
}
其中code
是b
。 GetCharIndex
的结果是:66,为什么我得到这个结果?
在此先感谢您的帮助。
答案 0 :(得分:0)
使用Array.IndexOf
https://docs.microsoft.com/en-us/dotnet/api/system.array.indexof?view=netframework-4.7.2
您得到的66是'B'ascii值。
FirstOrDefault函数返回实际项目(B)而不是索引。
所以:
int index = Array.IndexOf(_alpha, code.ToUpper());
答案 1 :(得分:0)
如前所述,您想使用Linq。 LINQ中的Select有一个替代,使您可以显示索引。获得第一个匹配值将为我们提供事件的索引。如果您希望匹配中的所有索引,也可以将.FirstOrDefault()
替换为.ToList()
。
要列出
char[] _alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToArray();
var code = "b";
var key = _alpha.Select((s, i) => new { i, s })
.Where(t => t.s.ToString().ToUpper() == code.ToUpper())
.Select(t => t.i)
.ToList();
或者,上面的内容也可以写成
FirstOrDefault
return _alpha.Select((s, i) => new { i, s }).FirstOrDefault(t => t.s.ToString().ToUpper() == code.ToUpper()).i;
答案 2 :(得分:0)
为什么我得到这个结果?
Nullable<Char>
可以隐式转换为Nullable<Int32>
,因为Char
可以隐式转换为Int32
。这会在您的return语句中发生。如果找到,您将从数组中返回字符。
人们所说的ASCII码,是指字符码;特别是由于.NET使用Unicode字符集的UTF-16字符编码,因此使用UTF-16代码单元值。
BTW-VB4 / 5/6 / A / Script,Java,JavaScript……也将UTF-16用于文本数据类型。
要使用标准的LINQ运算符,请选择提供像Select
这样的索引的运算符:
Char[] _alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
Func<Char, StringComparison, Int32?> GetIndexOf = (code, comparisonType) => {
var value = code.ToString();
return _alpha
.Select((c, i) => c.ToString()
.Equals(value, StringComparison.InvariantCultureIgnoreCase) ? i : (Int32?)null)
.FirstOrDefault(i => i.HasValue); } ;
Debug.Assert(1 == GetIndexOf('B', StringComparison.InvariantCultureIgnoreCase));
Debug.Assert(null == GetIndexOf('3', StringComparison.InvariantCultureIgnoreCase));
而且,您必须通过“ .ToUpper”决定您的真正意图。作为问题/代码审查问题,目前尚不清楚。最好以这样的方式编写您的问题和代码(或至少作为代码注释),以解释字母比较的正确文化。您所使用的语言取决于程序的当前区域性,该区域性是从程序启动时的用户区域性初始化的。