C# 同时迭代两个列表

C# 同时迭代两个列表,c#,iteration,C#,Iteration,我正在这样做 List<Type1> t1 = ... List<Type2> t2 = ... List<Type3> t3 = new List<Type3>(); for(int i = 0; i < t1.Count; i++) t3.AddRange(new Type3(t1[i], t2[i])); 这不会飞行,因为对象无法识别外部和内部属性。我也不能asit,因为它是匿名类型。我能做什么 我也不喜欢使用对象或变量,而是使

我正在这样做

List<Type1> t1 = ...
List<Type2> t2 = ...
List<Type3> t3 = new List<Type3>();

for(int i = 0; i < t1.Count; i++)
  t3.AddRange(new Type3(t1[i], t2[i]));
这不会飞行,因为
对象
无法识别
外部
内部
属性。我也不能
as
it,因为它是匿名类型。我能做什么

我也不喜欢使用
对象
变量
,而是使用
元组
或说“这是一种
组合类型的东西”的东西


注意。有讨论,但这并不能真正回答我的问题。在中,我无法获取字段。

您应该能够通过在循环中使用
var
而不是
对象
正确使用匿名类型
var
推断类型,并允许您按预期使用匿名对象

IEnumerable<Type1> t1 = ...
IEnumerable<Type2> t2 = ...
var t12 = t1.Zip(t2, (outer, inner)
  => new{ Outer = outer, Inner = inner});
List<Type3> t3 = new List<Type3>();

foreach(var element in t12)
  t3.Add(new Type3(element.Outer, element.Inner));

通过在循环中使用
var
而不是
object
,您应该能够正确使用匿名类型
var
推断类型,并允许您按预期使用匿名对象

IEnumerable<Type1> t1 = ...
IEnumerable<Type2> t2 = ...
var t12 = t1.Zip(t2, (outer, inner)
  => new{ Outer = outer, Inner = inner});
List<Type3> t3 = new List<Type3>();

foreach(var element in t12)
  t3.Add(new Type3(element.Outer, element.Inner));

也许是这样的:

IEnumerable<string> t1 = new[] { "test" };
IEnumerable<int> t2 = new[] { 1 };
IEnumerable<Tuple<string, int>> t3 = t1.Zip(t2, (outer, inner) => Tuple.Create(outer, inner));
IEnumerable<int> t1 = new List<int> { 1, 2, 3 };
IEnumerable<int> t2 = new List<int> { 1, 2, 3 };
var t12 = t1.Zip(t2, (outer, inner) => new { Outer = outer, Inner = inner });
var t3 = t12.Select(t => new { O = t.GetPropValue("Outer"), 
                               I = t.GetPropValue("Inner") });
IEnumerable t1=新列表{1,2,3};
IEnumerable t2=新列表{1,2,3};
var t12=t1.Zip(t2,(外部,内部)=>new{outer=outer,inner=inner});
var t3=t12.Select(t=>new{O=t.GetPropValue(“外部”),
I=t.GetPropValue(“内部”)};

可能是这样的:

IEnumerable<string> t1 = new[] { "test" };
IEnumerable<int> t2 = new[] { 1 };
IEnumerable<Tuple<string, int>> t3 = t1.Zip(t2, (outer, inner) => Tuple.Create(outer, inner));
IEnumerable<int> t1 = new List<int> { 1, 2, 3 };
IEnumerable<int> t2 = new List<int> { 1, 2, 3 };
var t12 = t1.Zip(t2, (outer, inner) => new { Outer = outer, Inner = inner });
var t3 = t12.Select(t => new { O = t.GetPropValue("Outer"), 
                               I = t.GetPropValue("Inner") });
IEnumerable t1=新列表{1,2,3};
IEnumerable t2=新列表{1,2,3};
var t12=t1.Zip(t2,(外部,内部)=>new{outer=outer,inner=inner});
var t3=t12.Select(t=>new{O=t.GetPropValue(“外部”),
I=t.GetPropValue(“内部”)};

您的第一种方法有什么问题?看起来不错。试过使用var或dynamic吗?我不太清楚你在问什么。你是说你现在正在做第一件事吗?这会给你带来麻烦吗?为什么要更改它?为什么要使用
对象
作为
元素
的类型<代码>对象没有
外部
内部
属性。@Oded因为我还不太擅长C#。我选择了
对象
,因为我创建了一个,嗯…,对象。这种方法是有效的,但我被告知最好使用隐式迭代器。你的第一种方法有什么问题?看起来不错。试过使用var或dynamic吗?我不太清楚你在问什么。你是说你现在正在做第一件事吗?这会给你带来麻烦吗?为什么要更改它?为什么要使用
对象
作为
元素
的类型<代码>对象没有
外部
内部
属性。@Oded因为我还不太擅长C#。我选择了
对象
,因为我创建了一个,嗯…,对象。这种方法是有效的,但我被告知最好使用隐式迭代器。
t12
也应该声明为
var
,而不是
IEnumerable
有没有一种方法可以说“这是一个”而不实际为其创建类?@CRMconfusee这是一种匿名类型。对匿名类型使用
var
。+1<代码>元组如果您对匿名类型/C非常陌生,可能更容易理解,因为您可以显式地为所有变量提供类型。@AlexeiLevenkov我更喜欢元组,因为它对返回的对象设置了更有限的边界。如果可以的话,我更愿意指定变量是元组类型。
t12
也应该声明为
var
而不是
IEnumerable
有没有一种方法可以说“它是一个”而不实际为它创建类?@CRMconfusee这是一个匿名类型。对匿名类型使用
var
。+1<代码>元组如果您对匿名类型/C非常陌生,可能更容易理解,因为您可以显式地为所有变量提供类型。@AlexeiLevenkov我更喜欢元组,因为它对返回的对象设置了更有限的边界。如果可以的话,我更愿意指定变量为元组类型。