在Linq中是否有办法为匹配条件的第一个选定事件设置一个值?
我知道我不是很好解释,但例如:
and the next entry after the prefix, ie
因此,在上面的示例中,所需的输出结果是var mySelectedObjects = allMyObjects.OrderBy(o.Date).Select(o => new ObjectType
{
Element1 = o.Element1,
Element2 = o.Element2,
Date = o.Date,
BooleanElement = o.BooleanElement && ThisIsTheFirstTrue
};
mySelectedObjects
项只有BooleanElement
出现的第一次时才会出现(由allMyObjects
排序,这是真的,其余的都是假的,无论Date
中的值是什么。
即。我只希望在allMyObjects
中BooleanElement
= true出现一次(最早)。我应该用{<1}}替换什么?
修改的
我意识到这可以在select之后使用mySelectedObjects
循环完成,但我希望在Select中完成所有操作。
无论如何只是为了回应建议而澄清。我希望它在第一次出现时是真的,它在输入中是真的,而不仅仅是第一次出现,所以例如如果输入数据是......
ThisIsTheFirstTrue
我希望输出为
for
答案 0 :(得分:3)
所以使用Linq
:
bool found = false;
var mySelectedObjects = objects
.OrderBy(o => o.Date)
.Select(o => new ObjectType
{
Element1 = o.Element1,
Element2 = o.Element2,
Date = o.Date,
BooleanElement = !found && o.BooleanElement ? (found = true) : false
}
);
答案 1 :(得分:2)
我会将它分配给一个循环,不是优雅而是工作:
var mySelectedObjects = allMyObjects
.OrderBy(o.Date)
.Select(o => new ObjectType
{
Element1 = o.Element1,
Element2 = o.Element2,
Date = o.Date,
BooleanElement = o.BooleanElement
});
bool firstTrueFound = false;
foreach(ObjectType o in mySelectedObjects)
{
if(o.BooleanElement)
{
if(firstTrueFound)
o.BooleanElement = false;
else
firstTrueFound = true;
}
}
我想到的唯一LINQ解决方案并不高效,请看:
var boolLookup = allMyObjects.ToLookup(o => o.BooleanElement);
var mySelectedObjects = boolLookup[true]
.OrderBy(o => o.Date)
.Select((o, index) => new ObjectType
{
Element1 = o.Element1,
Element2 = o.Element2,
Date = o.Date,
BooleanElement = index == 0
})
.Concat(boolLookup[false])
.OrderBy(o => o.Date);