3

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

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;了,那么结果就会有 Add 的定义,所以我不确定发生了什么?

4

2 回答 2

7

您正在调用Where()which 将返回一个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 });
于 2012-04-06T22:56:36.030 回答
0

添加到@Jon的答案

有一种Concat扩展方法IEnumerable<T>允许您在逻辑上将两个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 });
于 2012-04-06T23:30:04.970 回答