C# LINQ如何在查询后使用第一项上的where组合元组中的第二项

C# LINQ如何在查询后使用第一项上的where组合元组中的第二项,c#,linq,C#,Linq,我尝试通过以下方式查找相关元组: obs3[i].Item2 = obs1[i].Item2 + obs2[i].Item2 但是,我不知道如何访问和使用Item2 double,相反,我只得到obs1的一个子集 我的问题越来越少。我希望这是因为我没有尝试过第一次尝试解决方案。您可以在Item1 var obs3 = from o in obs1 where obs2.Contains(o) select o; var query=来自obs1中的t1 在t1.Item1上的obs2中加入

我尝试通过以下方式查找相关元组:

obs3[i].Item2 =  obs1[i].Item2 + obs2[i].Item2
但是,我不知道如何访问和使用
Item2 double
,相反,我只得到
obs1
的一个子集


我的问题越来越少。我希望这是因为我没有尝试过第一次尝试解决方案。

您可以在
Item1

var obs3 = from o in obs1 where obs2.Contains(o) select o;
var query=来自obs1中的t1
在t1.Item1上的obs2中加入t2等于t2.Item1
选择Tuple.Create(t1.Item1、t1.Item2+t2.Item2);
Tuple[]obs3=query.ToArray();

您可以使用下面的两个循环(不是基于Linq的解决方案)来完成

static void Main(字符串[]args)
{
Tuple[]obs1=新的Tuple[]{新的Tuple(1,1.2),新的Tuple(2,1.5),新的Tuple(3,2.2)};
Tuple[]obs2=新的Tuple[]{新的Tuple(1,2.1),新的Tuple(2,5.1),新的Tuple(4,2.2)};
元组[]obs3=新元组[obs1.Count()];
对于(int i=0;i
我有两个元组数组。编辑一行以显示索引,这可能令人困惑。我查看了Zip,但不知道如何在第一个元组项上进行选择,也不知道如何在第二个项上进行操作如果其中一个输入数组有多个具有相同
Item1
第一坐标
int
值的元组,会发生什么?如果情况并非如此,可以使用一些
字典
分类字典
分类列表
或类似工具?除非我将数据错误作为完整程序的输入,否则不会发生这种情况。真正的问题是
Tuple
,其中
MyType
包含
char
double
。我想我可以使用另一个具有唯一元素的有序结构。创建新数组时,您如何知道新数组
obs3
不会太长?由于执行了
中断,您确定
obs2
不会包含具有相同
Item1
的多个元组吗?与新元组(x,y)相比,新元组(x,y)
更易于读写
元组。创建(x,y)
@JeppeStigNielsen,这是正确的,但这是开始时的一个假设。。。
var obs3 = from o in obs1 where obs2.Contains(o) select o;
var query = from t1 in obs1
            join t2 in obs2 on t1.Item1 equals t2.Item1
            select Tuple.Create(t1.Item1, t1.Item2 + t2.Item2);

Tuple<int, double>[] obs3 = query.ToArray();
    static void Main(string[] args)
    {
        Tuple<int, double>[] obs1 = new Tuple<int, double>[] { new Tuple<int, double>(1, 1.2), new Tuple<int, double>(2, 1.5), new Tuple<int, double>(3, 2.2) };
        Tuple<int, double>[] obs2 = new Tuple<int, double>[] { new Tuple<int, double>(1, 2.1), new Tuple<int, double>(2, 5.1), new Tuple<int, double>(4, 2.2) }; ;
        Tuple<int, double>[] obs3 = new Tuple<int, double>[obs1.Count()];

        for (int i = 0; i < obs1.Count(); i++)
        {
            for (int j = 0; j < obs2.Count(); j++)
            {
                if (obs1[i].Item1 == obs2[j].Item1)
                {
                    obs3[i] = new Tuple<int, double>(obs1[i].Item1, obs1[i].Item2 + obs2[j].Item2);
                    break;
                }
            }
        }

        foreach (var item in obs3)
        {
            Console.WriteLine(item?.Item1 + "\t" + item?.Item2);
        }
        Console.ReadKey();
    }