【问题标题】:Get all values between two specific values in a list获取列表中两个特定值之间的所有值
【发布时间】:2023-03-21 06:29:01
【问题描述】:

我有一个字符列表:

var myList = new List<char>(new[] { 'x', 'y', '(', 'a', 'b', 'c', ')', 'z' });

使用值:

 'x'
 'y'
 '('
 'a'
 'b'
 'c'
 ')'
 'z' 

如何获取大括号之间的所有值?新列表中的值应如下所示:

 'a'
 'b'
 'c'

列表中大括号的索引可以在每个会话中更改。

【问题讨论】:

  • 您应该尝试做的第一件事是使用for loop 来充实这一点,这是一个很棒的角色塑造学习体验,会给您带来成就感。但是,您也可以将其转换为字符串并使用正则表达式,您可以使用 IndexOf 和各种各样的东西。但是就目前而言,这个问题表明缺乏研究
  • 到目前为止你尝试了什么?
  • 我尝试使用IndexOf 方法获取列表中第一个和第二个大括号的索引,然后使用Take 方法获取该索引之间的所有值。我希望有一些更简单的方法,例如使用 linq。
  • 列表不保证它们包含的数据发生变化时的顺序。
  • 100% 正确。这是List&lt;T&gt; 后面的source code。是的,它了解索引:public T this[int index] {。但是因为它允许插入和删除,所以它保证没有顺序。如果您的代码依赖于 List 被订购。您要么明确排序,要么使用IOrderedEnumerableSortedList

标签: c# linq char


【解决方案1】:

你可以使用这个 LINQ 表达式:

myList.SkipWhile(c => c != '(').Skip(1).TakeWhile(c => c != ')')
       ^----- 1 --------------^ ^- 2 -^ ^-------- 3 -----------^
  1. 跳过直到找到(
  2. 跳过我们找到的(
  3. 提取元素,直到找到)(不包含在内)

注意事项:

  1. 如果序列不包含起始括号,则返回一个空序列
  2. 如果序列不包含匹配的结束括号,其余的序列将被返回

【讨论】:

  • 不错的解决方案!我喜欢它,因为它不仅优雅易读,而且准确地传达了我们想要的内容。
【解决方案2】:

如果你找到它,你可以创建一个循环,它使用'['(左括号),然后直到你没有找到右括号']'将字符添加到另一个数组。

【讨论】:

  • 我考虑过那个解决方案,我希望有一些更简单的方法,例如使用 linq。
【解决方案3】:

您也可以分几步完成:

int start = myList.IndexOf('(') + 1;
int end = myList.IndexOf(')');
var result = myList.Skip(start).Take(end - start).ToList();

【讨论】:

    【解决方案4】:
    var myList = new List<char>(new[] { 'x', 'y', '(', 'a', 'b', 'c', ')', 'z' });
    var start = myList.FindIndex((c) => c == '(');
    var end = myList.FindIndex((c) => c == ')');
    if (start != -1 && end != -1 && start < end)
    {
         var result = myList.GetRange(start + 1, end - start - 1));
    }
    else
    {
        // return null or throw error
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 2017-08-04
      • 2014-01-30
      • 1970-01-01
      • 2022-11-15
      相关资源
      最近更新 更多