【问题标题】:Removing multiple characters from a string in c# using MyString.Remove(x,y)使用 MyString.Remove(x,y) 从 C# 中的字符串中删除多个字符
【发布时间】:2020-09-09 21:57:55
【问题描述】:

在我的服务器中运行程序时(信标检测代码),我将收到一个可变大小的字符串,名为io385

字符串长度会根据检测到的信标数而有所不同:

  • 一个信标:46 个字节(前 4 个字节无用,后 40 个重要,后 2 个无用);
  • 两个信标:90 个字节(前 2 个字节无用,接下来的 40 个重要,接下来的 2 个无用);
  • 三个信标:134 字节(前 2 个字节无用,接下来 40 个重要,接下来 2 个无用;

...

所以,有了这个,我的想法是删除任何无用的东西。即使字符串的大小可能不同,我总是想删除固定位置的字节(对于第一个信标,first 四个和 last 2;对于下一个信标,first 两个和 last 两个)。

我开始手动删除 2 beacon 字符串上的无用字节。但是,我想对此进行优化,以便无论字符串是 46 字节还是 xxxx 字节都可以自动工作(否则,我将不得不为每个可能的字符串长度手动编码字符删除过程)。

        string io385 = "11210000AAAA0000AAAA0000AAAA0000AAAA0A0A0A0ABF210000BBBB0000BBBB0000BBBB0000BBBB0B0B0B0BBF";
        string informacao = String.Copy(io385);
        
        informacao = informacao.Remove(0,4).Remove(40,2).Remove(40,2).Remove(80,2);
        
        
        int x = io385.Length;
        int y = informacao.Length;
        Console.WriteLine("Original String: {0}", io385); 
        Console.WriteLine("Copied String: {0}", informacao);
        Console.WriteLine("Original String length: {0}", x);
        Console.WriteLine("Copied String length: {0}", y);

【问题讨论】:

  • 您说要删除“字节”,但您真的指的是字符吗?不同的字符集每个字符的字节数不同。
  • 这个问题真的和teltonika有关系吗?听起来这只是关于从字符串中删除字符。
  • 迭代器方法,if(length = 46) substring else for loop i+=44 substring yield
  • @RufusL 我的错,是的,我的意思是字符,而不是字节。另外,是的,所有设备都是teltonika制造的,加上标签,因为它可能对其他人有用!
  • @MichaelRandall 我是 C# 新手(仅用 C/C++ 编写),但我理解你的想法!我将尝试基于此创建一个解决方案,并在完成后立即编辑帖子!

标签: c# .net string teltonika


【解决方案1】:

给定

public static IEnumerable<string> GetStuff(string input)
{
    Console.WriteLine(input.Length);
    if (input.Length == 46)
        yield return input.Substring(4, 40);
    else
        for (var i = 0; i < input.Length; i += 44)
            yield return input.Substring(i + 2, 40);
}

用法

var input = "xxxx1234567890123456789012345678901234567890xx";
var input2 = "xx1234567890123456789012345678901234567890xxxx1234567890123456789012345678901234567890xxxx1234567890123456789012345678901234567890xxxx1234567890123456789012345678901234567890xx";
Console.WriteLine(string.Join("\r\n", GetStuff(input)));
Console.WriteLine();
Console.WriteLine(string.Join("\r\n", GetStuff(input2)));

输出

46
1234567890123456789012345678901234567890

176
1234567890123456789012345678901234567890
1234567890123456789012345678901234567890
1234567890123456789012345678901234567890
1234567890123456789012345678901234567890

Full Demo Here

【讨论】:

  • @PoulBak 迭代器简洁明了
  • 太棒了!我想这正是@MichaelRandall 所说的!就像我之前说的,我是 C# 新手,但我了解代码背后的主要思想!
  • @Jonaas18 我是迈克尔·兰德尔 :)
  • 哦,抱歉啊:P 我目前正在从头开始创建代码并在浏览每一行时进行评论,以便正确理解它!非常感谢您的帮助!
【解决方案2】:

执行此操作的一种方法是首先删除前两个字符,以便字符串中的所有“信标”长度相同(44 个字符)。现在我们可以创建一个循环,从0length / 44,我们跳过iteration * 44 字符(即跳过以前的信标),然后跳过2 更多字符(即这个信标的前导2)和然后取40 个字符(我们关心的字符数)。

在一个方法中,这可能看起来像这样:

public static string RemoveUselessCharacters(string input)
{
    // Add argument validation first
    if (string.IsNullOrWhiteSpace(input) || input.Length < 46) return input;

    // Just remove the first two characters right away
    input = input.Substring(2);

    // This will hold the result
    var result = new StringBuilder();

    // Loop once for every beacon
    for (int i = 0; i < input.Length / 44; i++)
    {
         // Skip previous beacons plus two characters, then take 40 characters
        result.Append(string.Concat(input.Skip(i * 44 + 2).Take(40)));
    }

    // Return just the beacon charcters for all the beacons
    return result.ToString();
}

如果你想修改代码以返回一个List&lt;string&gt;,其中每个字符串都是一个单独的信标,很容易做到:

public static List<string> GetBeacons(string input)
{
    if (string.IsNullOrWhiteSpace(input) || input.Length < 46) 
        return new List<string> {input};

    input = input.Substring(2);
    var result = new List<string>();

    for (int i = 0; i < input.Length / 44; i++)
    {
        result.Add(string.Concat(input.Skip(i * 44 + 2).Take(40)));
    }

    return result;
}

【讨论】:

    猜你喜欢
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 2015-01-26
    • 2012-07-13
    • 2012-06-17
    • 2022-01-09
    相关资源
    最近更新 更多