没有定义 linq 语法中的 add

本文关键字:add 语法 linq 定义 | 更新日期: 2023-09-27 18:30:23

我正在获得与上一个问题相关的帮助,但随后被告知要问一个与之相关的新问题,但给出的代码遇到了错误:

public void AddPersonToCommunity(string person, string communityName) 
{ 
    var result = communities.Where(n => String.Equals(n.CommunityName, communityName)).FirstOrDefault(); 
    if (result != null) 
    { 
        result.Add(new Person() { PersonName = person }); //no definition for add?
    } 
}  

您可以在此处查看上一个问题以获取更多细节:休息关系?

如果我这样做var result = communities;结果将具有添加的定义,所以我不确定发生了什么?

没有定义 linq 语法中的 add

您正在调用Where()它将返回一个IEnumerable<Community>(没有Add方法),然后FirstOrDefault()返回一个Community(也没有Add方法)。您期望Add方法从何而来?

我怀疑你真的想要:

if (result != null) 
{ 
    result.People.Add(new Person { PersonName = person });
}

。因为Community.People是那个社区的人的名单,对吧?

请注意,如果您这样做var result = communities;确实会有一个 Add 方法 - 但签名为 Add(Community)而不是 Add(Person)

保持

所有事物的类型正确很重要。这实际上与 LINQ 关系不大。如果您尝试过,您会看到相同的结果:

Community community = new Community();
community.Add(new Person { PersonName = person });

添加到@Jon的答案中

IEnumerable<T>有一个Concat扩展方法,它允许您在逻辑上将两个IEnumerable<T>对象组合成一个跨越两个集合的单个IEnumerable<T>。 您可以将此逻辑扩展到追加单个元素,然后将其应用于当前情况。

public static IEnumerable<T> Concat(this IEnumerable<T> enumerable, T value) {
  foreach (var cur in enumerable) {
    yield return cur;
  }
  yield return value;
}
...
result = result.Concat(new Person() { PersonName = person });