2011-08-30 58 views
2

問題是:我得到了一個元素列表,然後使用group by。我需要得到另一個列表,其中包含每組中的一半元素。如何獲得列表中的一半元素?

我該怎麼做?我正在使用LINQ。

更新:

這是我得到的第一個列表。

 XDocument xdoc = XDocument.Load(path); 
     var conditions = from c in xdoc.Descendants("Condition") 
         select new 
         { 
          ObjectiveID = (int)c.Attribute("ObjectiveID"), 
          TypeID = (int)c.Attribute("TypeID"), 
          ProblemID = (int)c.Attribute("ProblemID"), 
          Ranges = (from r in c.Descendants("Range") 
             select new 
             { 
              Decimals = (int)r.Attribute("Decimals"), 
              Min = (decimal)r.Attribute("Min"), 
              Max = (decimal)r.Attribute("Max") 
             }).ToArray(), 
         }; 

這就是我正在使用的原件。從那一個,我只想從每個OBJECTIVEID中獲得一半的問題。

如果在enummerable我有2個相同的objectiveID的元素,我只能得到一個。如果我有一個問題,我必須只有一個,如果我有5我會有2或3.

+0

使用跳過和採取 –

+0

請出示一些源代碼... – Yahia

+0

信息更新 – Darf

回答

5

我不知道你在問什麼 - 你是否試圖從每個組中獲取單個元素進入另一個列表?如果是這樣,SelectMany可能是你要找的。

var numbers = new[] { 1,2,3,4,5,6,7,8,9 }; 
var evensAndOdds = numbers.GroupBy(x => x % 2); 
var evens = evensAndOdds.Where(g => g.Key == 0).SelectMany(g => g).ToList(); 
var odds = evensAndOdds.Where(g => g.Key == 1).SelectMany(g => g).ToList(); 

或者:

var evens = evensAndOdds.Single(g => g.Key == 0).ToList(); 


響應編輯

有選擇的重載還包括一個整數索引 - 你可以用它來過濾掉所有的奇數甚至可以獲得一半的物品。

您可以將其更改爲類似

Ranges = c.Descendants("Range") 
      .Select((range,i) => new { range, i }) 
      .Where(pair => pair.i % 2 == 0) // select only even items 
      .Select(pair => new { 
       Decimals = (int)pair.range.Attribute("Decimals"), 
       ... etc... 
      }) 
      .ToArray() 


我開始以爲我不明白的問題。如果問題是,你有一個像

condition1: objectiveID = 2 problemID = 100 
condition2: objectiveID = 2 problemID = 101 

數據,你不想要兩個不同problemIDs爲同一objectiveID,你可以使用的GroupBy /的SelectMany /送縮小到每objectiveID只有一個問題

xdoc.Descendants("Condition") 
    .GroupBy(c => c.Attribute("objectiveID").value) 
    .SelectMany(group => group.Take(1)) 
+0

那麼,我認爲使用組是一個好主意..請檢查更新..因爲問題是,以後..我需要撤消該組由 – Darf

+0

我不'在你的更新代碼中看不到任何分組,什麼是「每個分組的一半」。意思? – Jimmy

+0

那麼,我發佈的下面的代碼,我假設後面我需要使用一組來做到這一點.. 我真的想從每個OBJECTIVEID – Darf

0

對於任意IEnumerable你可以使用get交替分成兩個名單: -

var oneHalf = list.Select((x, i) => new {x, i}).Where(t => t.i%2 == 0).Select(t =>t.x); 
var otherHalf = list.Select((x, i) => new {x, i}).Where(t => t.i%2 != 0).Select(t =>t.x); 
相關問題