2011-09-30 17 views
15

Nesnelerin bir listesini almak ve anahtarın nesnede bir alan olduğu bir satıra dönüştürmek ve değer farklı bir liste oluşturmak istiyorum. anahtarda eşleşen nesnelerde alan. Bunu şimdi bir döngü ile yapabilirim ama bunun linq ile başarılabileceğini ve döngüyü yazmamam gerektiğini hissediyorum. GroupBy ve ToDictionary'un bir kombinasyonunu düşünüyordum, ancak şu ana kadar başarısız oldum. İşteConvert List <MyObject> - Sözlük <object.string, Liste <obj.ID>>

Şu anda bunu yapıyorum nasıl:

var samplesWithSpecificResult = new Dictionary<string, List<int>>(); 
foreach(var sample in sampleList) 
{ 
    List<int> sampleIDs = null; 
    if (samplesWithSpecificResult.TryGetValue(sample.ResultString, out sampleIDs)) 
    { 
     sampleIDs.Add(sample.ID); 
     continue; 
    } 
    sampleIDs = new List<int>(); 
    sampleIDs.Add(sample.ID); 
    samplesWithSpecificResult.Add(sample.ResultString, sampleIDs); 
} 

Ben .GroupBy().ToDictionay() ile alabilirsiniz en uzak Dictionary<sample.ResultString, List<sample>> olduğunu.

Herhangi bir yardım için teşekkür ederiz. Bu bir IGrouping<string, Sample> içine koyar -

+0

kullandı. microsoft.com/en-us/library/bb460184.aspx) –

cevap

28

onun ResultString üye tarafından aşağıdaki

var dictionary = sampleList 
    .GroupBy(x => x.ResultString, x => x.ID) 
    .ToDictionary(x => x.Key, x => x.ToList()); 

GroupBy fıkra irade grup listesindeki her Sample örneği deneyin ama her numunenin sadece Id bölümünü tutacak. Bu, her elemanın IGrouping<string, int> olacağı anlamına gelir.

ToDictionary bölümü, 'un Key'unu sözlük Tuşu olarak kullanır. IGrouping<string, int>IEnumerable<int>'u uygular ve bu nedenle Id numunesinin List<int> numarasına numaralı çağrıya dönüştürerek Key için verilen sözlüğün Value sözlüğüne dönüştürebiliriz. // msdn:

+0

Bu tam olarak aradığım şey. Teşekkürler! – Marcus

1
var samplesWithSpecificResult = 
    sampleList.GroupBy(s => s.ResultString) 
       .ToDictionary(g => g.Key, g => g.Select(s => s.ID).ToList()); 

Bizim burada yapıyoruz onların ResultString dayanan örnekler grubudur. Ardından, sözlük anahtarının her birinis olan bir sözlüke, Key anahtar sözcüğünü kullanarak ve her bir gruplandırmada numaralandırmayı (IGrouping<string, Sample> ayrıca bir IEnumerable<Sample>) kullanarak her bir örneğin için ID öğesini seçerek sözlük değeri için bir liste oluşturmayı öneririz.

2

Evet, çok basit. Anahtar, IEnumerable<T> üzerinde bir GroupBy yaptığınızda, her "grup", IEnumerable<T> uygulayan bir nesnedir (bu yüzden aşağıda g.Select söyleyebilirim ve özgün dizinin öğelerini ortak bir anahtarla yansıtıyorum): her grup ortak anahtarla Sample dizisidir böylece

var dictionary = 
    sampleList.GroupBy(x => x.ResultString) 
       .ToDictionary(
        g => g.Key, 
        g => g.Select(x => x.ID).ToList() 
    ); 

See, sampleList.GroupBy(x => x.ResultString) sonucu IEnumerable<U> bir IEnumerable<IGrouping<string, Sample>> ve IGrouping<T, U> uygular olduğunu!

3
Dictionary<string, List<int>> resultDictionary = 
(
    from sample in sampleList 
    group sample.ID by sample.ResultString 
).ToDictionary(g => g.Key, g => g.ToList()); 

Sen Listelerinin Sözlük yerine bir Arama kullanmayı düşünün isteyebilirsiniz

ILookup<string, int> idLookup = sampleList.ToLookup(
    sample => sample.ResultString, 
    sample => sample.ID 
); 

[Arama] (http sevmeyi öğrenin thusly

foreach(IGrouping<string, int> group in idLookup) 
{ 
    string resultString = group.Key; 
    List<int> ids = group.ToList(); 
    //do something with them. 
} 

//and 

List<int> ids = idLookup[resultString].ToList(); 
+0

Arama iyi bir fikir ve kesinlikle etrafta oynayacağım bir şey. Teşekkürler! – Marcus

İlgili konular