C# 字符串数组搜索

C# 字符串数组搜索,c#,arrays,logic,C#,Arrays,Logic,几天前,我参加了一个Jr.开发人员职位的面试,他们问: 如果您有一个字母“a”和“b”的数组,您将如何编写一个方法来计算数组中这些字母的实例数 我说过,您将有一个for循环,带有一个if-else语句,该语句将增加2个计数器变量中的1个。然而,在那之后,他们问我如何解决同样的问题,如果数组可以包含字母表中的任何字母。我说过我会用同样的方法,用一个长的IF语句,或者一个switch语句。事后看来,这似乎没有那么有效;有更简单的方法吗?您可以声明大小为256(可能的字符代码数)的数组,将其归零,然后

几天前,我参加了一个Jr.开发人员职位的面试,他们问:

如果您有一个字母“a”和“b”的数组,您将如何编写一个方法来计算数组中这些字母的实例数


我说过,您将有一个
for循环
,带有一个
if-else
语句,该语句将增加2个计数器变量中的1个。然而,在那之后,他们问我如何解决同样的问题,如果数组可以包含字母表中的任何字母。我说过我会用同样的方法,用一个长的
IF
语句,或者一个
switch
语句。事后看来,这似乎没有那么有效;有更简单的方法吗?

您可以声明大小为256(可能的字符代码数)的数组,将其归零,然后简单地增加与您读取的字符代码对应的数组

例如,如果您正在读取“a”,对应的代码是ASCII 97,因此您可以增加数组[97],您可以优化内存量,将代码减少97(如果您知道输入仅为字符),您还需要知道如何处理大写字符(您是否将它们简化为不同的字符)在这种情况下,您还需要注意将字符减少65

所以最后的代码是这样的:

int counts[122 - 97] = {0}; // codes of a - z
char a = get_next_char();
if ( is_capital(a)){
    counts[a - 65]++;
}
else 
{
    counts[a - 97] ++;
}
此代码假定“A”=“A”
如果不是这样的话,你需要在if中进行不同的翻译,但是你现在可能已经明白了这个想法。与您的方法相比,这节省了大量的比较。

这里给出了一个很好的示例,它可以解决您的查询

string[]array1={“猫”、“狗”、“胡萝卜”、“鸟”}
// //查找以子字符串开头的第一个元素。 // 字符串值1=Array.Find(array1, element=>element.StartsWith(“car”,StringComparison.Ordinal))
// //查找长度为三个字符的第一个元素。 // 字符串值2=Array.Find(array1, 元素=>element.Length==3); // //查找长度不超过四个字母的所有元素。 // 字符串[]array2=Array.FindAll(array1,
element=>element.Length根据目标是CPU效率、内存效率还是开发人员效率,您可以执行以下操作:

foreach(var grp in theString.GroupBy(c => c)) {
    Console.WriteLine("{0}: {1}", grp.Key, grp.Count());
}
虽然效率不高,但在非病理性的情况下也可以。在实际情况下,由于unicode,我可能会使用字典作为计数器-unicode太大了,无法预先分配数组

Dictionary<char, int> counts = new Dictionary<char, int>();
foreach(char c in theString) {
    int count;
    if(!counts.TryGetValue(c, out count)) count = 0;
    counts[c] = count + 1;
}
foreach(var pair in counts) {
    Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
}
字典计数=新建字典();
foreach(字符串中的字符c){
整数计数;
如果(!counts.TryGetValue(c,out count))计数=0;
计数[c]=计数+1;
}
foreach(计数中的var对){
WriteLine(“{0}:{1}”,pair.Key,pair.Value);
}

您可以创建
字典
,然后遍历数组,检查元素是否作为字典中的键和增量值存在

Dictionary<string, int> counter = new Dictionary<string, int>();
foreach(var item in items)
{
    if(counter.ContainsKey(item))
    {
        counter[item] = counter[item] + 1;
    }
}
字典计数器=新字典();
foreach(项目中的var项目)
{
if(柜台集装箱(项目))
{
柜台[项目]=柜台[项目]+1;
}
}

这将导致一个空字典,不是吗?是的,但这只是解决问题的方法。您可以像这样添加else语句
else{counter[item]=1;}
@marcGravel
Dictionary<string, int> counter = new Dictionary<string, int>();
foreach(var item in items)
{
    if(counter.ContainsKey(item))
    {
        counter[item] = counter[item] + 1;
    }
}