6

下面的简单程序将查找用户输入的字符串中的最后一个字母,然后删除该点之后的所有内容。所以,如果一个人输入一个string....之后的一切都g应该被删除。我有以下作为一个小程序:

class Program
{
    static void Main(string[] args)
    {
        Console.Write("Enter in the value of the string: ");
        List<char> charList = Console.ReadLine().Trim().ToList();

        int x = charList.LastIndexOf(charList.Last(char.IsLetter)) ;
        Console.WriteLine("this is the last letter {0}", x);
        Console.WriteLine("This is the length of the string {0}", charList.Count);
        Console.WriteLine("We should have the last {0} characters removed", charList.Count - x);

        for (int i = x; i < charList.Count; i++)
        {
            charList.Remove(charList[i]);
        }

        foreach (char c in charList)
        {
            Console.Write(c);
        }
        Console.ReadLine();
    }
}

我已经尝试了很多变体,但没有一个能准确地写出来。这个带有程序string....输出输入的特定程序是strin.. 所以不知何故它离开了它应该带走的东西,它实际上带走了它不应该带走的字母。任何人都可以说明为什么会这样吗?所需的输出再次应该是string.

4

10 回答 10

5

尝试这个:

string input = Console.ReadLine();                // ABC.ABC.
int index = input.Select((c, i) => new { c, i })
                 .Where(x => char.IsLetter(x.c))
                 .Max(x => x.i);
string trimmedInput = input.Substring(0, index + 1);
Console.WriteLine(trimmedInput);                  // ABC.ABC
于 2013-04-29T12:57:59.570 回答
3

只是解释一下,那是因为每次删除一个字符时,都会增加 i 计数器,但也会减少 charList.Count 所以你实际上删除了 1 个字符,留下下一个字符,然后再次删除等等......

例如,输入“string....”并且 x 为 5(G 字母的索引),您正在执行以下操作:

第一次迭代:删除 g 字符,使 x 变为 6,charList.Count 变为 9 (10-1)

下一次迭代:删除索引 6 处的字符,现在是第二个字符。(你的字符串是“strin ......”)

所以你错过了第一点。

我让您检查其他答案,因为它们包含针对您的问题的更优雅的解决方案。

于 2013-04-29T13:02:26.077 回答
2
string s = console.ReadLine();
s = s.Substring(0, s.ToList().FindLastIndex(char.IsLetter) + 1);
于 2013-04-29T13:06:49.273 回答
2

Substring我认为简单的string用户输入会更直接。所以考虑以下修改后的代码:

 class Program
 {
    static void Main(string[] args)
    {
        Console.Write("Enter in the value of the string: ");
        var s = Console.ReadLine().Trim();
        List<char> charList = s.ToList();

        int x = charList.LastIndexOf(charList.Last(char.IsLetter)) ;
        Console.WriteLine("this is the last letter {0}", x);
        Console.WriteLine("This is the length of the string {0}", charList.Count);
        Console.WriteLine("We should have the last {0} characters removed", charList.Count - x);

        Console.WriteLine(s.Substring(0, x + 1);
        Console.ReadLine();
    }
}

在这里我们存储用户输入的值s,找到一个字母的最后一个索引,然后Substring在写出到控制台时通过那个字母。

于 2013-04-29T12:59:35.803 回答
1

这是一种非常低效的方法(只是为了好玩!)

var trimmedInput = string.Join("", input.Reverse().SkipWhile(x => !char.IsLetter(x)).Reverse());
于 2013-04-29T13:09:12.370 回答
1

你可以使用这个扩展:

public static string TrimLettersLeft(this string input)
{ 
    int lastLetterIndex = -1;
    for (int i = input.Length - 1; i >= 0; i--)
    {
        if (Char.IsLetter(input[i]))
        {
            lastLetterIndex = i;
            break;
        }
    }

    if( lastLetterIndex == -1)
        return input;
    else
        return input.Substring(0, lastLetterIndex + 1);
}

输入: test...abc... 输出:test...abc

演示

于 2013-04-29T13:18:22.947 回答
1

解决方案将是这样的。

string charList = "string..."; //any string place here
int x = charList.LastIndexOf(charList.Last(char.IsLetter));
String str = charList.ToString().Substring(0, x + 1);
于 2013-04-29T13:19:33.973 回答
1

您还可以使用名为 SubString 的字符串函数来获取从第一个字母到最后一个字母的索引。

于 2013-04-29T13:01:05.460 回答
0

这将匹配每个单词字符(AZ、0-9 和 _):

string Input = Console.ReadLine();
string Userinput = String.Empty;
Regex TextSearch = new Regex(@"\w*");

if(TextSearch.IsMatch(Input))
    Userinput = TextSearch.Match(Input).Groups[0].Value;
else
    // No valid Input
于 2013-04-29T13:05:51.967 回答
0

我认为这是最短、最简单的选择:

编辑:评论指出了这里的一个初始错误,所以我添加了一些修复。现在应该可以很好地工作(可能不是最佳解决方案,但无论如何我认为这是一个有趣的简单解决方案):

var userInput = Console.ReadLine();

Console.WriteLine(new string(userInput.Reverse()
                                      .SkipWhile(c => !char.IsLetter(c))
                                      .Reverse()
                                      .ToArray()));
于 2013-04-29T13:06:08.183 回答