簡體   English   中英

通過 C# 中的預定義索引從字符串中刪除多個“單詞”?

[英]Remove multiple "words" from a string by predefined indexes in C#?

我正在嘗試為 Twitch 創建我的第一個聊天機器人,但我遇到了 Twitch 使用的表情的一些問題。

我需要能夠從字符串中刪除幾個表情(Twitch 上的表情只是單詞)。
我不知道這個詞是什么,但我知道這個詞在字符串中的位置,起始索引和長度。

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

在此處輸入圖片說明

使用tmi.js我可以獲取這條消息,包括消息中的表情並將它們發送到我的 C# 程序。
我在 C# 中從 tmi.js 收到的消息如下所示:

{'28087':['27-33','35-41'],'30259':['6-12']}

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

如何使用每個單詞/表情的預定義開始和停止位置從我的字符串中刪除所有這些單詞/表情?

我的一次不成功的嘗試:

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);
        }
    }
}

上面的代碼可以從字符串中刪除多個表情/單詞,只要表情/單詞相同即可。 混合表情/單詞不起作用。

首先,我鼓勵你擺脫這種dynamic 不僅因為你完全失去了類型安全,還因為它讓你更難理解你在做什么。 你可以有一個更好的結構:

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 個循環,您不需要擔心拆分、解析或其他任何事情。 您只需要從字符串中刪除這些索引:

foreach (var range in ranges)
{
    // TODO: remove range from message using range.Start and range.End
}

已經簡單多了! 現在,至於實際刪除表情,您需要在刪除后仔細考慮其余表情的索引。
您可以使用每個隨機表情並在每次刪除后處理message的開始和結束索引,但這很容易出錯,而且總體上太復雜了。
有一種更簡單的方法可以做到這一點,它是從最后一個表情開始,一直到第一個,實現這一點只是:

var ranges = JsonConvert
    // ... existing code
    .OrderByDescending(x => x.End);

因此,現在您擁有按結束位置排序的所有范圍,讓您可以輕松擺脫它們:

foreach (var range in ranges)
{
    message = message.Remove(range.Start, range.End - range.Start + 1);
}

看看這個在行動: https : //dotnetfiddle.net/QkktG3

Hello HeyGuys how are you? WutFace WutFace
Hello HeyGuys how are you? WutFace 
Hello HeyGuys how are you?  
Hello  how are you?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM