List<MyClass> myClassList;
List<string> identifierList;
我有两个相同计数的列表
identifierList.Select((value,index)=>new {value, index}).ToList().ForEach(x=> myClassList[x.index].identifier = x.value);
我想知道在标识符列表中枚举的myClassList中分配标识符的最佳方法是什么?
我写了这个,但看起来太长了(效率低下?)。必须有更好的方法吗?
Deleted 665 files
Writing data to coverage.info.cleaned
lcov: ERROR: cannot write to coverage.info.cleaned!
CMakeFiles/coverage.dir/build.make:57: recipe for target 'CMakeFiles/coverage' failed
make[3]: *** [CMakeFiles/coverage] Error 13
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/coverage.dir/all' failed
make[2]: *** [CMakeFiles/coverage.dir/all] Error 2
CMakeFiles/Makefile2:74: recipe for target 'CMakeFiles/coverage.dir/rule' failed
make[1]: *** [CMakeFiles/coverage.dir/rule] Error 2
Makefile:129: recipe for target 'coverage' failed
make: *** [coverage] Error 2
enter code here
答案 0 :(得分:2)
是的,你的方法是效率低下的(你正在创建一个一次性列表)并且不太可读,如果两个列表的大小不同,也会引发异常。
您正在寻找通过索引加入的Enumerable.Zip
扩展方法:
var zipped = myClassList.Zip(identifierList, (c, s) => new { class = c, string = s});
foreach(var x in zipped)
x.class.identifier = x.string;
答案 1 :(得分:1)
您可以使用Zip:
myClassList.Zip(identifierList, (klass, id) =>
{
klass.identifier = id;
return klass
});
请注意,这将为您提供一个变异的Linq表达式。
然而,我怀疑这可能更清楚:
for(int i = 0; i < myClassList.Count; i++)
{
myClassList[i].identifier = identifierList[i];
}
它可能不像&#34; hip&#34;使用Linq,但它更容易阅读和理解正在发生的事情!
答案 2 :(得分:0)
嗯,这样的简单查询怎么样。
myClassList.Select((e, i) => { e.identifier = identifierList[i]; return e; }).ToList();
我们需要这个.ToList()
来执行查询,否则它什么都不做。
示例:
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 + " ");
输出:abc def ghi
如果您的收藏品长度不同,您可以使用:
myClassList.Select((e, i) => { e.Id = i < identifierList.Count? identifierList[i] : e.Id; return e; }).ToList();