2017-12-15 7 views
1

私は最初の要素を取る単純なGroupByをやっていますが、それぞれの結果のプロパティの1つを変更したいと思います。Linq:投影中にプロパティを設定する

class M 
{ 
public string Name {get; set;} 
public int NOfPeopleWithTheSameName {get; set;} 
public string P1 {get; set;} 
public string P2 {get; set;} 
public string P3 {get; set;} 
public string P4 {get; set;} 
public string P5 {get; set;} 
} 


List<M> myList = GetMyList(); 


var l2 = myList 
    .GroupBy(m => m.Name) 
    .Select(group => new M { Name = group.Key, NOfPeopleWithTheSameName = group.Count() }); 

これはかなり簡単ですが、クラスが(すべてのプロパティ値が新しいものにコピーする必要があるため)多くのプロパティを持っている場合は、この方法がベストではないでしょうか?私はそれらを一つずつコピーするべきです。私は単に要素を取得し、プロパティを変更したい

NOfPeopleWithTheSameName

+0

:このような

public class ModelCount<T> { public T Model { get; set; } public int Count { get; set; } } 

そして今グループ:たとえば、あなたはこのような一般的なラッパークラスを持つことができます既存のものを変異させている。 – juharr

+0

'myList'が' M'型のリストであると言っていますか? – DavidG

+0

はい、myListはM – Revious

答えて

2

あなたは新しいMを作成する必要はありません、あなたは例えば、既存のものを返すことができます:あなたはこのためにあなたのモデルにプロパティを追加しようとしている場合

var l2 = myList 
    .GroupBy(m => m.Name) 
    .Select(group => 
    { 
     var m = group.First(); 
     m.NOfPeopleWithTheSameName = group.Count(); 
     return m; 
    }); 

しかし、私の代わりにINIをラップ異なるクラスを持つことをお勧めモデルとカウントはあなたのモデルを汚染しません。それはあなたが新しい 'M'のオブジェクトまたはあなたはOKだろう場合かどうかによって異なり

var l2 = myList 
    .GroupBy(m => m.Name) 
    .Select(group => new ModelCount<M> 
    { 
     Model = group.First(), 
     Count = group.Count() 
    }); 
+0

@TimSchmelter:質問を編集します。この例では5つのプロパティを追加しました。 1つのプロパティの値を変更するために新しいオブジェクトを初期化すると、わずかなプロパティがあっても7つ以上の場合に意味があります。 – Revious

+1

@downvoterどうして説明するの? – DavidG

+0

@Revious Downvotesは大丈夫です、私は担当者を気にしませんが、私は自分の投稿が間違っていることを知りたいです。私はそれらを修正するか、それを削除して静かに同意しないで、票を立てさせる。誰かがコメントする必要はなく、ほとんどの人がなぜそうしないのかを知ることができます。 – DavidG

1

はい、あなた ...

class Test 
{ 
    public string Name { get; set; } 
    public int Number { get; set; } 
} 

var tests = new List<Test> { /* ... your data here ... */ }; 

var modifiedTests = tests.Select(test => { test.Name = "MODIFIED"; return test; }); 

// this actually executes above query and modifies your original items in the list: 
var modifiedMaterialized = modifiedTests.ToList(); 

をすることができますが、あなたが本当に、本当に(!)ではないはず!

LinQは、クエリの言語に組み込まれています。副作用のあるクエリは悪いです。口ひげは邪悪な。ちょっとしないと、あなたは自分自身にたくさんの苦痛を与えません。


私は何をを望むことがちょうどきゅうではなく、定期的なループを考える:

class M 
{ 
public string Name {get; set;} 
public int NOfPeopleWithTheSameName {get; set;} 
public string P1 {get; set;} 
public string P2 {get; set;} 
public string P3 {get; set;} 
public string P4 {get; set;} 
public string P5 {get; set;} 
} 

List<M> myList = GetMyList(); 

var groups = myList.GroupBy(m => m.Name).ToList(); 

foreach(var group in groups) 
{ 
    foreach(var member in group) 
    { 
     member.NOfPeopleWithTheSameName = group.Count(); 
    } 
} 
+0

ありがとう! それはGroupByのカウントと組み合わせることはできますか? – Revious

+0

* LinQは言語統合されています** query **。* SQLを作った人にそれを伝えてください... – Adrian

+0

@それはおそらくそれかもしれません...しかしあなたはすべきではありません。データの更新は通常のループの仕事です。ただ書きなさい。 – nvoigt

関連する問題