【问题标题】:Update IList<T> from another IList<T>从另一个 IList<T> 更新 IList<T>
【发布时间】:2014-08-19 15:34:28
【问题描述】:

我有两个 IList。

IList&lt;CustomClassOne&gt; 类型的用户和

IList&lt;CustomClassTwo&gt; 类型的联系人。

这两个类都有一个唯一的 ID。我需要使用 CustomClassTwo 的属性“Info”填写 CustomClassOne 的属性“Description”。

foreach (CustomClassOne user in users )
{
    if (!string.IsNullOrEmpty(user.Description))
    {
        long id = user.ID;
        string desc = user.Description;

        var temp =  contacts.Select(p => p.ID = id);
        ...
        ...
    }
    else
        continue;

}

【问题讨论】:

    标签: c# generics collections ilist


    【解决方案1】:

    听起来你需要使用Join

    foreach (var pair in users.Join(contacts, u => u.ID, c => c.ID, Tuple.Create))
    {
        pair.Item1.Description = pair.Item2.Info;
    }
    

    或者如果你喜欢query syntax:

    var pairs = 
        from user in users 
        join contact in contacts on user.ID equals contact.ID
        select new { user, contact };
    foreach (var pair in pairs)
    {
        pair.user.Description = pair.contact.Info;
    }
    

    【讨论】:

    • 感谢您的回复。我是 linq 的新手。这里通过分配pair.user.Description,是否给用户列表赋值?可能是个愚蠢的问题。
    • @Shaamil 假设CustomClassOneclass 而不是struct,那么pair.user 是对内存中与列表中的项目相同的实例的引用。换句话说,是的,这将修改原始列表中user 的实例。
    【解决方案2】:

    您可以使用Join 将这两种类型匹配在一起,之后您可以迭代匹配并应用更改。

    var query = from contact in contacts
        join user in users
        on contact.Id equals user.Id
        into users
        select new 
        {
            contact,
            users,
        }
    
    foreach(var match in query)
        foreach(var user in match.users)
        {
            user.Description = match.contact.Info;
        }
    

    【讨论】:

      【解决方案3】:

      您可以在 foreach 循环中进行搜索,如果找到,则分配给 CustomClassOne 实例:

      foreach (CustomClassOne item in users)
      {
           var temp = contacts.Find(c => c.ID == item.ID);
           item.Description = temp == null ? item.Description : temp.Info;
      }
      

      【讨论】:

        猜你喜欢
        • 2017-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-02
        • 1970-01-01
        • 2012-05-28
        • 1970-01-01
        相关资源
        最近更新 更多