[英]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.