首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过C#中预定义的索引从字符串中删除多个“单词”?

通过C#中预定义的索引从字符串中删除多个“单词”?
EN

Stack Overflow用户
提问于 2021-10-24 19:37:18
回答 1查看 69关注 0票数 0

我正在尝试为Twitch创建我的第一个聊天机器人,并且我遇到了一些问题,我使用的表情。

我需要能够从一个字符串中删除几个表情(在抽搐上的表情仅仅是单词)。

我不知道单词是什么,但我知道单词在字符串中的位置,起始索引和长度。

例如,消息:Hello HeyGuys how are you? WutFace WutFace在the上生成以下内容:

使用tmi.js,我可以获取这条消息,包括消息中的表情,并将它们发送到我的C#程序。

我在C#中从tmi.js收到的消息如下所示:

{ '28087':'27-33','35-41‘,'30259':'6-12’}

其中,"28087“和"30259”是表情的ID,27-33,35-41和6-12是表情在消息本身中的位置。

如何使用每个单词/表情的预定义开始和停止位置从字符串中删除所有这些单词/表情?

我的一次失败的尝试:

代码语言:javascript
复制
dynamic json = JsonConvert.DeserializeObject(emotes); // { '28087': [ '27-33', '35-41' ], '30259': [ '6-12' ] }
int prevLength = 0;
foreach (var a in json)
{
    foreach (var b in a)
    {
        for (int i = 0; i < b.Count; i++)
        {
            string range = b[i];
            int start = Convert.ToInt32(range.Split('-')[0]);
            int end = Convert.ToInt32(range.Split('-')[1]);
            int length = end - start;
            length = length + 1;
            if (prevLength != 0)
            {
                start = start - prevLength;
            }
            prevLength = prevLength + length;
            message = message.Remove(start, length);
        }
    }
}

上面的代码可以从字符串中删除多个表情/单词,只要表情/单词是相同的。混合表情/词不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-24 20:25:54

首先,我鼓励你摆脱那个dynamic。这不仅是因为你完全失去了类型安全,还因为它使你更难理解你在做什么。你可以有一个更好的结构,只要:

代码语言:javascript
复制
var ranges = JsonConvert
    .DeserializeObject<Dictionary<string, string[]>>(emotes)
    // Get the strings in each list, the Key doesn't matter here
    .SelectMany(x => x.Value)
    // And transform the strings into objects like { int Start; int End; }
    .Select(x => 
    { 
        var splitted = x.Split('-'); 

        return new 
        { 
            Start = int.Parse(splitted[0]), 
            End = int.Parse(splitted[1]) 
        }; 
    });

现在,您不需要3个循环,您不需要担心拆分、解析或其他任何事情。您只需要从字符串中删除这些索引:

代码语言:javascript
复制
foreach (var range in ranges)
{
    // TODO: remove range from message using range.Start and range.End
}

已经简单多了!现在,对于实际删除这些表情,您需要仔细考虑删除其他表情的索引。

您可以在每次删除后,获取每个随机表情,并处理message中的开始和结束索引,但这很容易出错,而且总体上太复杂了。

有一种简单得多的方法可以做到这一点,从最后一个表情开始,一直工作到第一个,只有这样才能做到这一点:

代码语言:javascript
复制
var ranges = JsonConvert
    // ... existing code
    .OrderByDescending(x => x.End);

所以现在你可以根据它们的末端位置来排序所有的范围,这样你就可以很容易地摆脱它们了:

代码语言:javascript
复制
foreach (var range in ranges)
{
    message = message.Remove(range.Start, range.End - range.Start + 1);
}

看看这个动作:https://dotnetfiddle.net/QkktG3

代码语言:javascript
复制
Hello HeyGuys how are you? WutFace WutFace
Hello HeyGuys how are you? WutFace 
Hello HeyGuys how are you?  
Hello  how are you?
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69700152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档