将IEnumerable <string>转换为ICollection <string>

时间:2015-12-01 19:30:21

标签: c# linq generics

我同时传入IEnumerable<string>ICollection<string>作为方法的参数。在方法中,我想将一些值连接到ICollection<string>并将concat调用的返回值重新分配回传入的ICollection<string>。我的问题是,最有效的方法是什么?

  

无法将源类型'System.Collections.Generic.IEnumerable<string>'转换为目标类型'System.Collections.Generic.ICollection<string>'

void DoSomething(IEnumerable<string> values, ICollection<string> otherValues)
{
    // Ideally, I could chain after the Concat and get my ICollection<string>.
    otherValues = otherValues.Concat(GetConcatValues());

    // Remaining source left out for brevity...
}

我完全理解转换的问题,ICollection<string>继承IEnumerable<string>。另外,我知道.Concat调用会返回IEnumerable<string>而不是所需的ICollection<string>

我只是想知道是否存在一个已存在的单行扩展方法,它会故意将其转换为我想要的集合?另外,我刚才意识到我说IEnumerable<string>ICollection<string>就像一百万次......

1 个答案:

答案 0 :(得分:4)

由于您必须转换为实现ICollection界面的其中一个类,因此在您的ToList上调用IEnumerable<string>即可:

otherValues = otherValues.Concat(GetConcatValues()).ToList();

注意:分配给otherValues对调用者没有影响,因为它不是通过引用或out参数传递的。假设您将可修改的集合传递给方法,您可以使用来自Concat的数据填充它:

foreach(var s in GetConcatValues()) {
    otherValues.Add(s);
}