gpt4 book ai didi

c# - 我怎样才能得到列表的一半元素?

转载 作者:行者123 更新时间:2023-12-05 09:24:58 25 4
gpt4 key购买 nike

问题是:我得到了一个元素列表,然后我使用了分组依据。我需要得到另一个列表,其中包含每个分组依据的一半元素。

我该怎么做?我正在使用 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 中得到一半的问题。

如果在可枚举中我有两个相同 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();

或者:

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


对编辑的回应

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()


我开始觉得我不明白这个问题。如果问题是你有像

这样的数据
condition1: objectiveID = 2 problemID = 100
condition2: objectiveID = 2 problemID = 101

并且您不希望同一个 objectiveID 有两个不同的问题 ID,您可以使用 GroupBy/SelectMany/Take 将每个 objectiveID 缩小到只有一个问题

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

关于c# - 我怎样才能得到列表的一半元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7250713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com