如何获得列表中的一半元素?

问题描述:

问题是:我得到了一个元素列表,然后使用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

我不知道你在问什么 - 你是否试图从每个组中获取单个元素进入另一个列表?如果是这样,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

对于任意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);