.net 提取List〈List>和List之间的公共项< string>< string>- C#

9q78igpj  于 2022-11-26  发布在  .NET
关注(0)|答案(4)|浏览(151)

我有一个List<List<string>> Full,由

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

可被读取

string2 = Full[sublistX][element1];

一个List<string> Strings包含一些string2的示例
我想创建一个新的List<List<string> NewList,它只包含Full[sublistX][element1]的子列表,它等于List<string>Strings中的任何元素

例如,

List<List<string>> Full = new List<List<string>>()
{
    new List<string>() { "11", "AA", "!!", },
    new List<string>() { "22", "BB", "@@", },
    new List<string>() { "33", "CC", "##", },
    new List<string>() { "44", "DD", "$$", },
};

List<string> Strings = new List<string>()
{
    "AA", "DD",
};

我希望List<List<string> NewList包含:

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”包含很多子列表而“String”只有很少的元素时。
1.从代码中可以看到,现在每个子列表中有10个元素,将来可能会增加/减少,但我硬编码了NewList[ListIndex].Add,从索引0到9。有没有办法获得子列表元素的计数?这样我就可以使用for(sublist elements count)添加NewList。

vmjh9lq9

vmjh9lq91#

您可以使用Intersect ... Any

List<List<string>> resultList = FullLIst
    .Where(list => strings.Intersect(list).Any())
    .ToList();

如果列表很大,这比Contains的性能更好。

fwzugrvs

fwzugrvs2#

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

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

这将给予你一个列表,它包括Full至少有一个元素被Strings列表包含的任何列表。
Fiddle

2nc8po8w

2nc8po8w3#

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();

// or faster for big lists
var searchItemsSet = new HashSet<string>(searchItems);
var result = full.Where(list => list.Any(searchItemsSet .Contains)).ToList();
vzgqcmou

vzgqcmou4#

我觉得这样读起来更好一点:

List<List<string>> NewList =
(
    from xs in Full
    where xs.Any(x => Strings.Any(s => x.Contains(s)))
    select xs
).ToList();

相关问题