C# 枚举两个集合
我有两个相同计数的列表C# 枚举两个集合,c#,C#,我有两个相同计数的列表 class MyClass { string identifier; } 是的,您的方法效率低下(您正在创建一个一次性列表),可读性不强,并且如果两个列表的大小不同,还会引发异常 您正在寻找通过索引联接的扩展方法: identifierList.Select((value,index)=>new {value, index}).ToList().ForEach(x=> myClassList[x.index].identifier = x.value);
class MyClass
{
string identifier;
}
是的,您的方法效率低下(您正在创建一个一次性列表),可读性不强,并且如果两个列表的大小不同,还会引发异常 您正在寻找通过索引联接的扩展方法:
identifierList.Select((value,index)=>new {value, index}).ToList().ForEach(x=> myClassList[x.index].identifier = x.value);
那么,像这样的简单查询怎么样
var zipped = myClassList.Zip(identifierList, (c, s) => new { class = c, string = s});
foreach(var x in zipped)
x.class.identifier = x.string;
我们需要这个.ToList()
来执行查询,否则它将什么也不做
例如:
myClassList.Select((e, i) => { e.identifier = identifierList[i]; return e; }).ToList();
您可以使用:
请注意,这将为您提供一个突变的Linq表达式
然而,我怀疑这可能更清楚:
myClassList.Zip(identifierList, (klass, id) =>
{
klass.identifier = id;
return klass
});
for(int i=0;i
它可能不像使用Linq那样“时髦”,但它更容易阅读和理解正在发生的事情 为什么不做一个简单的
for
循环呢?因为循环已经过去了一个世纪。只有林克,只有铁杆@YacoubMassad公平点。只是想知道有没有办法有效地进行速记编码。在使用for循环和LINQ之间总是有一个折衷。与for循环相比,LINQ确实有一些开销,最大的问题是可读性。只要你对1号邮轮的含义感到满意,并且你会在6个月后知道它的含义,那么就可以了。在我看来,你是在试图保留订单?列表的枚举数
将保留顺序,因此您只需执行以下操作:var myClassList=identifierList.Select(x=>new MyClass{identifier=x}).ToList()代码>,您的列表将具有相同的顺序。LINQ查询不应产生副作用;)@TimSchmelter-我知道:-)你最喜欢for循环吗?@Jimmy:不,只有当你需要访问上一个或下一个元素或者处理两个元素大小不同的情况时。Zip将只处理第二个集合中的myClassList.Count
元素。也许我更喜欢字典。如果您有两个按索引关联的集合,则这是可疑的。
List<string> identifierList = new List<string>()
{
"abc", "def", "ghi"
};
List<MyClass> myClassList = new List<MyClass>()
{
new MyClass(), new MyClass(), new MyClass(),
};
myClassList.Select((e, i) => { e.Id = identifierList[i]; return e; }).ToList();
foreach (var item in myClassList)
Console.Write(item.Id + " ");
myClassList.Select((e, i) => { e.Id = i < identifierList.Count? identifierList[i] : e.Id; return e; }).ToList();
myClassList.Zip(identifierList, (klass, id) =>
{
klass.identifier = id;
return klass
});
for(int i = 0; i < myClassList.Count; i++)
{
myClassList[i].identifier = identifierList[i];
}