linq 从另一个列表中搜索包含某个int的列表

5uzkadbs  于 2023-05-04  发布在  其他
关注(0)|答案(4)|浏览(165)

我发现自己需要创建一个新的列表,该列表具有给定列表上的某些属性。
例如;我有这份名单

List<string> aStringList = new List<string>() { 
                                                "meat1", "meat2", 
                                                "tomato3", "tomatoes4",
                                                "brocolli5", "brocoli6"
                                               };

则给定参数

List<int> aIntList = new List<int>() { 1, 2, 6 };

我需要生成一个新的列表,其中只包含 * meat 1,meat 2,brocoli 6 *
我知道我可以用这个

var matchingvalues = aStringList.Where(s => s.Contains(aIntList [0].ToString()) 
                                          || s.Contains(aIntList [1].ToString())
                                          || s.Contains(aIntList [2].ToString())
                                        );

但它很丑而且没有活力。
有没有其他的想法来改善这一点。?

u3r8eeie

u3r8eeie1#

您可以在 Linq 的帮助下 * 查询 * 现有列表,其中可以接受valueindex

List<string> aStringList = new List<string>() { 
  "meat1", "meat2", 
  "tomato3", "tomatoes4",
  "brocolli5", "brocoli6"
};

List<int> aIntList = new List<int>() { 1, 2, 6 };

// Please, note Where syntax:
// we accept all values but filter by index 
var matchingvalues = aStringList
  .Where((value, index) => aIntList.Contains(index + 1))
  .ToList(); // Let's have a list as a result

另一种可能性是查询aIntList:对于aIntList中的每个index,我们从aStringList返回相应的项:

var matchingvalues = aIntList
  .Where(index >= 1 && index <= aStringList.Count)
  .Select(index => aStringList[index - 1])
  .ToList();
py49o6xq

py49o6xq2#

目前还不完全清楚aIntList包含什么。如果它包含索引,那么@dmitry-bychenko的答案是好的。但如果第二个列表包含部分内容,那么您可以使用这种方法

List<string> aStringList = new List<string>() {
    "meat1", "meat2",
    "tomato3", "tomatoes4",
    "brocolli5", "brocoli6"
};

List<int> aIntList = new List<int>() { 1, 6, 2 };

var matchingvalues = aStringList.Where(s => aIntList.Any(a=>s.Contains(a.ToString())));

它允许您避免在Where条件下的显式迭代。
另一种方法是使用Join,但需要首先解析字符串。它可以看起来像这样

var matchingvalues2 = aStringList.Join(
    aIntList,
    s => int.Parse(Regex.Match(s, @"\d+$", RegexOptions.RightToLeft).Value),
    i => i,
    (s, i) => s
);
xsuvu9jc

xsuvu9jc3#

可以使用Any

var matchingvalues = aStringList.Where(s => 
    aIntList.Any(i =>
        s.Contains(i.ToString())
    )
);
20jt8wwn

20jt8wwn4#

试试这个:

static class Program
{
    static void Main(string[] args)
    {
        List<string> aStringList 
            = new List<string>() {
                "meat1", "meat2",
                "tomato3", "tomatoes4",
                "brocolli5", "brocoli6" };

        List<int> aIntList = new List<int>() { 1, 2, 6 };

        List<string> matchingvalues 
            = aIntList.Select((index) => aStringList[index-1]).ToList();

        Console.WriteLine(string.Join(", ", matchingvalues));
        // meat1, meat2, brocoli6
    }
}

不需要.Where().Containts()或类似的东西。使用数组aIntList直接从aStringList中提取所需的值。

相关问题