枚举两个集合

时间:2016-06-07 09:49:39

标签: c#

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

3 个答案:

答案 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();