在 C# 中从 2 个列表创建一个元组

Create a Tuple from 2 Lists in C#

我有以下 2 个列表: // 我想从下面的列表中检索每个计划的文本,例如:foreach(var plan in AvailablePlanNames) and then use plan.Text property.

private IList<IWebElement> AvailablePlanNames =>
            _webDriver.FindElementsWithWait(By.XPath("//div[@class='asc-checkbox-group']"));

// 从下面的列表中,我将提取 2 个属性,例如:

foreach(var planDetail in PlanDetails), fetch:
planDetail.GetAttribute("id") and planDetail.GetAttribute("checked")

private IList<IWebElement> PlansDetails => _webDriver.FindElementsWithWait(By.XPath("//div[@class='asc-checkbox-group']/input"));

所以第一个列表有:["Plan A", "Plan B", "Plan C"] 第二个列表可以是:[[Plan A ID , true], [Plan B ID, false], [Plan C ID, null]]

我正在尝试制作一个像 Tuple 这样的单一列表,其中将包含:

Tuple((Plan A, Plan A ID, true), (Plan B, Plan B ID, false), (Plan C, Plan C ID, null))

我搜索了几篇文章并尝试了多种解决方案,但没有成功。

    public IList<string> GetAvailablePlans()
    {
        var list = new List<(string Text, string, string)>();

        foreach (var planName in AvailablePlanNames)
        {
            foreach (var planDetail in PlansDetails)
            {
                
                list.Add((planName.Text, 
                    planDetail.GetAttribute("id"), 
                    planDetail.GetAttribute("checked")));
            }

        }
        return (IList<string>)list;
    }

是这样的吗?此代码假定 PlansDetails[i] 对应于指定 iAvailablePlanNames[i]。如果不是这样,您还需要为每个 AvailablePlanNames[i]PlansDetails 中找到相应的数据。 该代码还使用正确的 return 值(元组列表而不是字符串列表)。

public List<(string Text, string, bool)> GetAvailablePlans()
{
    var list = new List<(string Text, string, string)>();

    for (var i; i<AvailablePlanNames.Length;i++)
    {
            list.Add((AvailablePlanNames[i].Text, 
                PlansDetails[i].GetAttribute("id"), 
                PlansDetails[i].GetAttribute("checked")));
    }
    return list;
}

您可以使用 LINQ 的 Zip 来组合来自两个 IEnumerable<T> 的项目,而不是循环。 :

var results=AvailablePlanNames
                .Zip(PlanDetails)
                .Select((first,second)=>
                           ( Text: first.Text,
                             Id:   second.GetAttribute("id"),
                             Check:second.GetAttrbute("checked")
                           ))
                .ToList();