问题是:我得到了一个元素列表,然后我使用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(),
};
Run Code Online (Sandbox Code Playgroud)
那是我正在使用的原版.从那个,我只想从每个OBJECTIVEID得到一半的问题.
如果在无法控制的情况下,我有2个相同objectiveID的元素,那么我必须只获得一个.如果我遇到一个问题,我必须只得到一个,如果我有5个我有2个或3个.
我不确定你在问什么 - 你是不是想把每个组中的个别元素放到另一个列表中?如果是这样,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();
Run Code Online (Sandbox Code Playgroud)
或者:
var evens = evensAndOdds.Single(g => g.Key == 0).ToList();
Run Code Online (Sandbox Code Playgroud)
Select的重载也包括整数索引 - 您可以使用它来过滤掉所有奇数或偶数项以获得一半的集合.
你可以改成它
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()
Run Code Online (Sandbox Code Playgroud)
condition1: objectiveID = 2 problemID = 100
condition2: objectiveID = 2 problemID = 101
Run Code Online (Sandbox Code Playgroud)
并且您不希望同一个objectiveID有两个不同的problemID,您可以使用GroupBy/SelectMany/Take缩小到每个objectiveID只有一个问题
xdoc.Descendants("Condition")
.GroupBy(c => c.Attribute("objectiveID").value)
.SelectMany(group => group.Take(1))
Run Code Online (Sandbox Code Playgroud)