【问题标题】:How do I search for a string in a list within an array?如何在数组的列表中搜索字符串?
【发布时间】:2019-07-23 18:11:57
【问题描述】:

我创建了一个数据类型为 List 的数组,如下所示:

List<string>[] phase2 = new List<string>[200];

有很多初始化(这里是一个简单的例子):

    phase2[0] = new List<string>() { "Bob", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes", };
    phase2[1] = new List<string>() { "Jim", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes" };
    phase2[2] = new List<string>() { "Joe", "Complex", "A", "AOT", "zNO", "Yes", "Yes", "Yes" };
    phase2[3] = new List<string>() { "Bill", "Complex", "A", "AOT", "Yes", "Yes", "Yes", "Yes" };
    phase2[4] = new List<string>() { "Robert", "Complex", "A", "PL", "zNO", "Yes", "Yes", "Yes" };

我想知道如何在我已初始化的所有数组的索引 3 中搜索字符串“B”?

另外作为奖励(不确定这是否可能)您可以在不同的索引中搜索多个字符串吗?例如,我想返回索引 3 中字符串值为“B”,索引 5 中字符串值为“Yes”的所有列表。

任何帮助将不胜感激。

编辑:感谢所有回复!我还没有了解 linq,所以很多答案都在我的脑海中。感谢 lollercoasters 提供的简化解决方案 :)

【问题讨论】:

  • 您是否尝试过任何方法,请提供您可能尝试过的任何解决方案,这可能会给您带来一些问题......
  • 你会多次查询这个结构吗?我的意思是列表数组......它会被缓存吗?
  • 试试phase2.Where(x =&gt; x[2] == "B" &amp;&amp; x[4] == "Yes");

标签: c# arrays list search


【解决方案1】:

如果你想要一个你能更好理解的非 Linq lambda 解决方案,那么你就去吧:

List<string>[] phase2 = new List<string>[200];
phase2[0] = new List<string>() { "Bob", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes", };
phase2[1] = new List<string>() { "Jim", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes" };
phase2[2] = new List<string>() { "Joe", "Complex", "A", "AOT", "zNO", "Yes", "Yes", "Yes" };
phase2[3] = new List<string>() { "Bill", "Complex", "A", "AOT", "Yes", "Yes", "Yes", "Yes" };
phase2[4] = new List<string>() { "Robert", "Complex", "A", "PL", "zNO", "Yes", "Yes", "Yes" };

for (int i = 0; i < phase2.Length; i++)
{
  var list = phase2[i];
  if (list == null) continue; // skip empty lists
  if (list[2] == "B" && list[4] == "Yes")
  {
    // found elements in list
    Console.WriteLine("found elements in list at index: " + i);
  }
}

【讨论】:

  • 如何在显示的指定索引处显示列表的内容?抱歉,我没有马上回复你。
  • 我不确定,但我认为您的意思是 list[i] ?
【解决方案2】:

这是 LINQ 的做法:

static void Main(string[] args)
{
    List<string>[] phase2 = Enumerable.Repeat(new List<string>(), 200).ToArray();

    phase2[0] = new List<string>() { "Bob", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes", };
    phase2[1] = new List<string>() { "Jim", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes" };
    phase2[2] = new List<string>() { "Joe", "Complex", "A", "AOT", "zNO", "Yes", "Yes", "Yes" };
    phase2[3] = new List<string>() { "Bill", "Complex", "A", "AOT", "Yes", "Yes", "Yes", "Yes" };
    phase2[4] = new List<string>() { "Robert", "Complex", "A", "PL", "zNO", "Yes", "Yes", "Yes" };

    List<string>[] result = phase2?.Where(x => x.Any(y => y == "B")).ToArray();
}

【讨论】:

    【解决方案3】:

    简而言之,记住phase2中的每个元素都是一个列表,所以它实现了Enumerable,这样就打开了它上面的所有LINQ功能。 使用您提供的函数(谓词)立即想到查找。

    https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.find?view=netframework-4.7.2

    如果你研究这条途径,你会学到很多东西。

    【讨论】:

      【解决方案4】:

      您可以使用 Linq 搜索所有具有与您的参数匹配的元素的列表,如下所示:

      phase2.Where(list => list.Any(item => item == "string to search for"));
      

      【讨论】:

        【解决方案5】:

        下面是一个可以帮助你的课程:

        public class ListFilterer
        {
            private readonly List<string>[] _searchSpace;
        
            public ListFilterer(List<string>[] searchSpace)
                => this._searchSpace = searchSpace ?? new List<string>[0];
        
            public IEnumerable<List<string>> GetListsHaving(params Tuple<int, string>[] query)
                => (from l in _searchSpace
                    where AllConditionsMatch(l, query)
                    select l);
        
            private static bool AllConditionsMatch(IReadOnlyList<string> lst, IEnumerable<Tuple<int, string>> conditions)
            {
                foreach (var cond in conditions)
                {
                    if (cond.Item1 < 0 || cond.Item1 > lst.Count - 1)
                        return false;
        
                    if (lst[cond.Item1] != cond.Item2)
                        return false;
                }
        
                return true;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2020-09-29
          • 2013-04-11
          • 1970-01-01
          • 2011-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多