c# - 合并两个 IEnumerable<T>

标签 c# merge

我有两个 IEnumerable<T>

其中充满了后备元素。这一个将始终包含最多的元素。 另一个将根据某些参数进行填充,并且可能包含较少的元素。 如果第二个元素不存在,我需要用第一个元素的等效元素填充它。

这段代码完成了工作,但我觉得效率低下,需要我将 IEnumerables 转换为 ILists 或使用临时列表 人实现 IEquatable

IEnumerable<Person> fallBack = Repository.GetPersons();
IList<Person> translated = Repository.GetPersons(language).ToList();

foreach (Person person in fallBack)
{
    if (!translated.Any(p=>p.equals(person)))
        translated.add(person);  
}

有什么建议吗?

最佳答案

translated.Union(fallback)

或者(如果 Person 没有通过 ID 实现 IEquatable<Person>)

translated.Union(fallback, PersonComparer.Instance)

PersonComparer 在哪里:

public class PersonComparer : IEqualityComparer<Person>
{
    public static readonly PersonComparer Instance = new PersonComparer();

    // We don't need any more instances
    private PersonComparer() {}

    public int GetHashCode(Person p)
    {
        return p.id;
    }

    public bool Equals(Person p1, Person p2)
    {
        if (Object.ReferenceEquals(p1, p2))
        {
            return true;
        }
        if (Object.ReferenceEquals(p1, null) ||
            Object.ReferenceEquals(p2, null))
        {
            return false;
        }
        return p1.id == p2.id;
    }
}

关于c# - 合并两个 IEnumerable<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/590991/

相关文章:

svn - 如何避免大量的svn :mergeInfo when merging trunk to a feature-branch in SVN

git merge recursive theirs,它是如何工作的?

c# - 在使用 Dapper 语句之前声明动态结果

c# - 如何判断文件是否可执行?

c# - 在一个请求中创建和设置 CRM 实体的状态

c# - 使用 GribCS 库 C# 迭代 Grib2 值?

git - 如何更改 Gitlab 中 merge 的默认目标分支

c# - 序列化和反序列化类中的静态成员?

php - 可以合并两个以上具有不同元素编号的二维数组吗?

c - 在C中将两个字符串合并在一起,关闭字符