【问题标题】:Extract common between List<List<string>> and List<string> - C#提取 List<List<string>> 和 List<string> 之间的共同点 - C#
【发布时间】:2022-11-21 15:34:04
【问题描述】:

我有一个List&lt;List&lt;string&gt;&gt; Full,由

for(...){
Full.Add(new List<string>());
Full[ListIndex].Add(string1);
Full[ListIndex].Add(string2);
Full[ListIndex].Add(string3);
...
}

可以阅读

string2 = Full[sublistX][element1];

List&lt;string&gt; Strings包含string2的一些实例

我想创建一个新的 List&lt;List&lt;string&gt; NewList 只包含来自 Full[sublistX][element1] 的子列表,它等于 List&lt;string&gt;Strings 中的任何元素

例如,

List<List<string>> Full will have:
sublist0: "11", "AA", "!!";
sublist1: "22", "BB", "@@";
sublist2: "33", "CC", "##";
sublist3: "44", "DD", "$$";
...
List<string> Strings will have:
"AA", "DD"...

I want the List<List<string> NewList contain:
sublist0: "11", "AA", "!!"; //match "AA"
sublist1: "44", "DD", "$$"; //match "DD"
...

现在,我可能正在以一种愚蠢的方式(硬编码)

List<List<string>> Full;
List<string> Strings;
List<List<string>> NewList;

for (int i = 0; i < Full.Count; i++)
{
    if (Strings.Contains(Full[i][4]))
    {
        NewList.Add(new List<string>());
        NewList[ListIndex].Add(Full[i][0]);
        NewList[ListIndex].Add(Full[i][1]);
        NewList[ListIndex].Add(Full[i][2]);
        NewList[ListIndex].Add(Full[i][3]);
        NewList[ListIndex].Add(Full[i][4]);
        NewList[ListIndex].Add(Full[i][5]);
        NewList[ListIndex].Add(Full[i][6]);
        NewList[ListIndex].Add(Full[i][7]);
        NewList[ListIndex].Add(Full[i][8]);
        NewList[ListIndex].Add(Full[i][9]);
        ListIndex++;
    }
}

我的问题是:有更好的方法吗?

我认为可能有两点需要优化:

  1. 避免使用for() 遍历整个“Full”列表,尤其是当“Full”包含很多子列表而“Strings”只有很少的元素时。
  2. 从代码中你可以看到我现在在每个子列表中有 10 个元素,将来可能会增加/减少,但我将 NewList[ListIndex].Add 从索引 0 硬编码到 9。有没有办法获得子列表元素的计数?这样我就可以使用for(sublist elements count) 添加新列表。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    那么,您可以按如下方式使用 Linq:

    var filteredList = Full.Any(strs => strs.Any(s=> Strings.Contains(s))).ToList();
    

    这将为您提供一个列表,其中包含Full 至少有一个元素包含在Strings 列表中的任何列表。

    【讨论】:

      【解决方案2】:
      List<List<string>> full = ...;
      List<string> searchItems = ...;
      
      // only filtering
      var result = full.Where(l => searchItems.Any(l.Contains)).ToList();
      
      // also copying
      var result = full.Where(l => searchItems.Any(l.Contains)).Select(l => l.ToList()).ToList();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-24
        • 1970-01-01
        • 1970-01-01
        • 2012-12-26
        • 2023-03-18
        • 2013-11-03
        • 2012-06-07
        相关资源
        最近更新 更多