如何解决从字符串列表中按提供的字符串中出现的顺序获取元素
嗨,我的字符串列表如下。
List<string> MyList = new List<string> { "[FirstName]","[LastName]","[VoicePhoneNumber]","[SMSPhoneNumber]" };
如果按顺序存在于字符串中,我需要从列表中获取所有元素。例如我的字符串是
string MessageContent = Hello [LastName] [FirstName]There,this message is for [SMSPhoneNumber]
我现在正在做
var Exists = MyList.Where(MessageContent.Contains);
此新列表包含MyList中所有出现在MessageContent字符串中的项目,但未按顺序出现。 我如何才能按顺序获得出现的字符串?
根据示例,所需列表为= {“ [LastName]”,“ [FirstName]”,“ [SMSPhoneNumber]”}
解决方法
我建议使用IndexOf
来确定位置(从而确定顺序)和存在,以避免两次搜索MessageContent
,但要以对答案进行排序为代价:
var ans = MyList.Select(w => new { w,pos = MessageContent.IndexOf(w) })
.Where(wp => wp.pos >= 0)
.OrderBy(wp => wp.pos)
.Select(wp => wp.w)
.ToList();
但是,如果一个字段可能出现多次,或者您认为避免重复扫描MessageContent
的速度快于多个IndexOf
(每个MyList
成员一次)的速度(可能不是) )并避免排序,那么您可以反转搜索(使用Span
以避免生成大量String
s):
var ans2 = Enumerable.Range(0,MessageContent.Length-MyList.Select(w => w.Length).Min())
.Select(p => MyList.FirstOrDefault(w => MessageContent.AsSpan().Slice(p).StartsWith(w)))
.Where(w => w != null)
.ToList();
,
我使用
var Exists = MyList.Where(MessageContent.Contains).OrderBy(s => MessageContent.IndexOf(s));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。