当前位置:  开发笔记 > 编程语言 > 正文

如何将两个IEnumerables合并(或压缩)?

如何解决《如何将两个IEnumerables合并(或压缩)?》经验,为你挑选了2个好方法。

我有一个IEnumerableIEnumerable我想要合并到IEnumerable>KeyValuePair中连接在一起的元素的索引是相同的.注意我没有使用IList,所以我没有计算我正在合并的项目或索引.我怎样才能做到最好?我更喜欢LINQ的答案,但任何以优雅的方式完成工作的东西都会起作用.



1> Mauricio Sch..:

注意:从.NET 4.0开始,该框架.Zip在IEnumerable中包含一个扩展方法,在此处记录.以下内容适用于后代,适用于早于4.0的.NET framework版本.

我使用这些扩展方法:

// From http://community.bartdesmet.net/blogs/bart/archive/2008/11/03/c-4-0-feature-focus-part-3-intermezzo-linq-s-new-zip-operator.aspx
public static IEnumerable Zip(this IEnumerable first, IEnumerable second, Func func) {
    if (first == null) 
        throw new ArgumentNullException("first");
    if (second == null) 
        throw new ArgumentNullException("second");
    if (func == null)
        throw new ArgumentNullException("func");
    using (var ie1 = first.GetEnumerator())
    using (var ie2 = second.GetEnumerator())
        while (ie1.MoveNext() && ie2.MoveNext())
            yield return func(ie1.Current, ie2.Current);
}

public static IEnumerable> Zip(this IEnumerable first, IEnumerable second) {
    return first.Zip(second, (f, s) => new KeyValuePair(f, s));
}

编辑:在评论之后,我不得不澄清并解决一些问题:

我最初从Bart De Smet的博客中逐字逐句实施了Zip

添加了枚举器处理(在Bart的原始帖子中也有注明)

添加了空参数检查(也在Bart的帖子中讨论过)



2> Lasse Espeho..:

作为对这个问题绊脚石的任何人的更新,.Net 4.0本身支持这个来自MS:

int[] numbers = { 1, 2, 3, 4 };
string[] words = { "one", "two", "three" };

var numbersAndWords = numbers.Zip(words, (first, second) => first + " " + second);

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有