私はlinqクエリを持っています
var x = (from t in types select t).GroupBy(g =>g.Type)
タイプごとにオブジェクトをグループ化するため、グループ化されたすべてのオブジェクトとそれらのカウントを含む単一の新しいオブジェクトが必要になります。このようなもの:
type1, 30
type2, 43
type3, 72
より明確に:グループ化の結果は、アイテムタイプごとのオブジェクトではなく、1つのオブジェクトにある必要があります。
読み取り: 101 LINQ Samples その中で LINQ-Grouping Operators Microsoft MSDNサイトから
var x = from t in types group t by t.Type
into grp
select new { type = grp.key, count = grp.Count() };
forsingleオブジェクトはstringbuilderを利用し、辞書の形でこれを行うか変換する追加します
// fordictionary
var x = (from t in types group t by t.Type
into grp
select new { type = grp.key, count = grp.Count() })
.ToDictionary( t => t.type, t => t.count);
//for stringbuilder not sure for this
var x = from t in types group t by t.Type
into grp
select new { type = grp.key, count = grp.Count() };
StringBuilder MyStringBuilder = new StringBuilder();
foreach (var res in x)
{
//: is separator between to object
MyStringBuilder.Append(result.Type +" , "+ result.Count + " : ");
}
Console.WriteLine(MyStringBuilder.ToString());
すべてのグループ化されたオブジェクト、またはすべてのタイプ?あなたがただ望むかもしれないように聞こえます:
var query = types.GroupBy(t => t.Type)
.Select(g => new { Type = g.Key, Count = g.Count() });
foreach (var result in query)
{
Console.WriteLine("{0}, {1}", result.Type, result.Count);
}
編集:want辞書でそれを使用する場合、次を使用できます:
var query = types.GroupBy(t => t.Type)
.ToDictionary(g => g.Key, g => g.Count());
ペアに選択してthen辞書を作成する必要はありません。
ここでの答えは私に近づきましたが、2016年に次のLINQを書くことができました。
List<ObjectType> objectList = similarTypeList.Select(o =>
new ObjectType
{
PropertyOne = o.PropertyOne,
PropertyTwo = o.PropertyTwo,
PropertyThree = o.PropertyThree
}).ToList();
var x = from t in types
group t by t.Type into grouped
select new { type = grouped.Key,
count = grouped.Count() };
各タイプでルックアップを実行してその頻度を取得できるようにするには、列挙を辞書に変換する必要があります。
var types = new[] {typeof(string), typeof(string), typeof(int)};
var x = types
.GroupBy(type => type)
.ToDictionary(g => g.Key, g => g.Count());
foreach (var kvp in x) {
Console.WriteLine("Type {0}, Count {1}", kvp.Key, kvp.Value);
}
Console.WriteLine("string has a count of {0}", x[typeof(string)]);
これは、LINQクエリから新しいオブジェクトを作成するために必要な構文に関する優れた記事です。
ただし、オブジェクトのフィールドに入力する割り当てが単純な割り当て以外のものである場合(たとえば、文字列を整数に解析し、そのうちの1つが失敗した場合)、これをデバッグすることはできません。個々の割り当てにブレークポイントを作成することはできません。
また、すべての割り当てをサブルーチンに移動し、そこから新しいオブジェクトを返し、そのルーチンにブレークポイントを設定しようとすると、そのルーチンにブレークポイントを設定できますが、ブレークポイントはトリガーされません。
代わりに:
var query2 = from c in doc.Descendants("SuggestionItem")
select new SuggestionItem
{ Phrase = c.Element("Phrase").Value
Blocked = bool.Parse(c.Element("Blocked").Value),
SeenCount = int.Parse(c.Element("SeenCount").Value)
};
または
var query2 = from c in doc.Descendants("SuggestionItem")
select new SuggestionItem(c);
私は代わりにこれをしました:
List<SuggestionItem> retList = new List<SuggestionItem>();
var query = from c in doc.Descendants("SuggestionItem") select c;
foreach (XElement item in query)
{
SuggestionItem anItem = new SuggestionItem(item);
retList.Add(anItem);
}
これにより、デバッグが簡単になり、どの割り当てが失敗したかを把握できました。この場合、XElementには、SuggestionItemに設定するために解析するフィールドがありませんでした。
新しいライブラリルーチンの単体テストを作成中に、Visual Studio 2017でこれらの問題に遭遇しました。