如何求和字符串中字母的序数值

时间:2014-07-24 04:43:52

标签: arrays linq

我正在创建一个函数,该函数将返回数组中元素索引的总和。

下面是我的代码,但是如果textCondition =" aa"则会出现小错误。或者任何具有相同值的元素,该函数只计算一次索引。它应该是(条件[]中的索引*号。元素。是否有可能在linq中解决这个问题?

string textCondition = "aa";
string[] alphabet = { "", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };
string[] condition = new string[textCondition.Length];
int idx = 0;
while (idx < textCondition.Length)
{
    string con = textCondition.Substring(idx++, 1);
    condition[idx - 1] = con;
}

var sum = alphabet.Select((v, i) => new { Index = i, Value = v })
          .Where(t => condition.Contains(t.Value))
          .Select(t => t.Index)
          .ToList().Sum();

1 个答案:

答案 0 :(得分:0)

从我所看到的,您只想根据字母来总结序数。如果是这种情况,为什么不在字符串中使用字符的ASCII码,并减去一个常量值,使其从1开始?

小写'a'是ASCII 97,因此只需从字母中减去96就可以获得相同的行为,前提是它们都在[a-z]范围内。

请注意,字符串也可以看作是字符的IEnumerable,因此您不必使用循环来获取字符,因为所有内容都可以使用LINQ方法直接完成。

这样的事情应该做:

textCondition.Sum(c => c - 96);

或者,如果你想:

textCondition.Sum(c => c - 'a' + 1);

如果您只想将小写字母相加,只是跳过其余字符,您只需使用Where子句过滤它们即可。

textCondition.Where(c => c >= 'a' && c <= 'z').Sum(c => c - 'a' + 1);