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?
    } 
}  

詳細については、ここで前の質問を参照してください: Relationships in rest?

私がvar result = communities;結果を出すと、追加の定義が得られるので、何が起こっているのかわかりませんか?

4

2 に答える 2

7

Where()どちらがIEnumerable<Community>(メソッドなし)を返し、Add次に(メソッドもありません)を返します。メソッドはどこから来ると思いますか?FirstOrDefault()CommunityAddAdd

私はあなたが本当に欲しいと思う:

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の答えに追加

2 つのオブジェクトを両方のコレクションにまたがる単一のオブジェクトに論理的に結合できるようにする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 に答える