2016-09-06 10 views
-4

私はContractsというオブジェクトのリストを生成する方法を探しています。C#のリストからgroupByを持つリストを含むオブジェクトのリストを構築するには?

入力には、ID, ContractName, Filenameで構成された契約のリストがあります。私は出力として、名前とIdsとFileNameを収集する文字列のIEnumerable<Documents> (ID, Filename)との契約のリストを持っている方法を探しています。

契約は、名前で集められた多くのファイルに似ています。

私はLinqを使うことができ、groupbyを使用しなければならないことを知っています。IEnumerableを実装するのは難しいです。

入力リスト

ID, ContractName, FileName 
01, Contract1, File 1 
02, Contract1, File 2 
03, Contract1, File 3 
04, Contract2, File 4 
05, Contract3, File 5 
06, Contract3, File 6 
07, Contract3, File 7 

出力リスト:

Contract 1, { {01, File 1},{02, File 2},{ 03, File 3} } 
Contract 2, { {04, File 4}} 
Contract 1, { {05, File 5},{06, File 6},{ 07, File 7} } 
+4

は、あなたがのところに来て、あなたがそれを持っていたものな困難表現コードを提供することができますか? –

+1

また、[ask]と[MCVE]の作成方法を見てみましょう。 –

答えて

1

質問は少し不明であるが、基本的に一致するオブジェクトとIEnumerableをGroupBy()がメソッドから返されIGrouping<TKey, TElement>リストの各要素の一部となります。

例:

var contractGroups = contracts.GroupBy(c => c.ContractName); 
foreach(var contractGroup in contractGroups) 
{ 
    Console.WriteLine(contractGroup.Key + ":"); 
    foreach(var contractFile in contractGroup) 
    { 
     Console.WriteLine("ID " + contractFile.ID + " = " + contractFile.Filename); 
    } 

    Console.WriteLine(); 
} 

// ...or create more specific container objects for the result 
var contractFiles = contractGroups.Select(cg => new { ContractName = cg.Key, Files = cg.Select(file => new { file.ID, file.Filename }) }); 
1

あなたはLookup<k, v>を作成するためにToLookupを使用することができます。

var contractNameLookup = contracts.ToLookup(c => c.ContractName); 

今あなたがに属しているすべてのファイルを検索することができます簡単で効率的な名前:

List<string> fileNamesOfContract = contractNameLookup["foo"] 
    .Select(c => c.Filename) 
    .ToList(); 

名前がルックアップに含まれていない場合は、空のリストが表示されます。

Lookup<TKey, TElement>は、Dictionary<TKey, TValue>に似ています。 の相違点は、Dictionary<TKey, TValue>がキーを単一の の値にマップし、Lookup<TKey, TElement>のキーを の値の値にマップする点です。

関連する問題