文字列とその文字列の値を含むリストがありますが、リストには同じ名前の複数の文字列が含まれているため、名前をグループ化し、その名前の値を単一のエントリに追加したいと考えています。例えば
名前 ..... 値
apple ----- 2
mango ----- 4
banana ---- 8
apple ----- 4
今、私はリンゴを単一のエントリとして追加したいと考えています。
このようにgroupbyを行うことができます
yourlist.GroupBy(x=>x.YourField())
あなたが何を望んでいるのかは、異なる値を取得することだと私は知っていると思います。これができる方法よりも
List<String> MyListOfFruit = new List<String>()
{
{"Banana"},
{"Banana"},
{"Apple"}
};
List<String> GroupedListOfFruits = new List<String>();
GroupedListOfFruits.AddRange(MyListOfFruit.Distinct());
//Now GroupedListOfFruits contains two items: Banana and Apple.
それ以外の場合は、正確にどのようなリストがあるかをコードの一部として投稿してください。たぶんのリストはありKeyValuePair<String, int>
ますか?
キーから値を分離する - の数は可変のように見えるため、正規表現を使用して分割する方が適切だと思います。
var query = yourlist.Select(x=>{
var arr = Regex.Split(x,@"[-]+");
return new{
Name = arr[0],
Value = Int32.Parse(arr[1])
};
})
.GroupBy(x=>x.Name)
.Select(x=> new{Name = x.Key, Value=x.Sum(y=>y.Value)});
このようにして、プロパティ Name が文字列に等しく、プロパティ Value がそのような Name を持つ要素の値の合計に等しい、新しい匿名オブジェクトが作成されます。
代わりに、値の合計を値として文字列として返したい場合は、最後の選択を次のように置き換えることができます。
.Select(x=> x.Key + " ----- " + x.Sum(y=>y.Value).ToString());
名前と値のフィールドを持つリストが既にある場合は、最初の Select を削除します。