Linq 从字符串列表中获取元素以及该列表中字符的位置

Posted

技术标签:

【中文标题】Linq 从字符串列表中获取元素以及该列表中字符的位置【英文标题】:Linq get element from string list and a position of a char in this list 【发布时间】:2021-12-19 11:03:46 【问题描述】:

我想从一个字符串列表中获取一个元素,并使用 linq 获取一个字符在该列表中的位置?

例子:

List<string> lines = new List<string>  "TOTO=1", "TATA=2", "TUTU=3"

我想从列表中的 TOTO 中提取值 1

这是我的代码的开始

var value= lines.ToList().Single(x =>x.Contains("TOTO=")).ToString().Trim();

如何继续这段代码提取1?

【问题讨论】:

为什么你想要 1 作为结果?那是这个列表中字符的什么位置?您想要两个结果,字符串"1" 和索引5? 【参考方案1】:

添加这个:

value = value[(value.LastIndexOf('=') + 1)..];

【讨论】:

【参考方案2】:

使用 LINQ 你可以做到这一点:

List<string> lines = new List<string>  "TOTO=1", "TATA=2", "TUTU=3" ;

int value = lines
    .Select(line => line.Split('='))
    .Where(parts => parts[0] == "TOTO")
    .Select(parts => int.Parse(parts[1]))
    .Single();

如果您总是希望该列表中的每个项目都采用正确的格式,那么这应该可以工作,否则您需要添加一些验证。

【讨论】:

【参考方案3】:

类似于@jtate 提出的建议,一些小的改进会有所帮助。

int value = lines
    .Select(line => line.Split(new [] '=' , StringSplitOptions.RemoveEmptyEntries))
    .Where(parts => string.Equals(parts[0], "TOTO", StringComparison.InvariantCultureIgnoreCase))
    .Select(parts => int.Parse(parts[1]))
    .SingleOrDefault();

SingleOrDefault - 如果您没有找到任何与您的约束匹配的元素,Single() 将抛出异常。在这里,SingleOrDefault 将返回 0;

String.Equals - 会处理任何上下游或任何文化相关的问题。

StringSplitOptions.RemoveEmptyEntries - 会限制一些不必要的迭代并提高性能。

还请查看您是否需要 int.TryParse 而不是 int.Prase。所有这些检查将有助于覆盖生产中的边缘情况

【讨论】:

以上是关于Linq 从字符串列表中获取元素以及该列表中字符的位置的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 LINQ 从列表中选择各种长度的部分 [关闭]

如何从内存列表中获取一组不同的属性值?

Linq + Reflection通过字段名称和条件从列表中获取元素

C# LINQ 从字符串数组列表中选择

从 C# 中的 XML 字符串中获取元素列表

如何使用适配器为recyclerview从字符串数组列表中的元素获取字符串