Linq Select:仅为首次出现设置特定值

时间:2017-02-06 10:06:26

标签: c# linq

在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中的值是什么。

即。我只希望在allMyObjectsBooleanElement = true出现一次(最早)。我应该用{<1}}替换什么?

修改

我意识到这可以在select之后使用mySelectedObjects循环完成,但我希望在Select中完成所有操作。

无论如何只是为了回应建议而澄清。我希望它在第一次出现时是真的,它在输入中是真的,而不仅仅是第一次出现,所以例如如果输入数据是......

ThisIsTheFirstTrue

我希望输出为

for

2 个答案:

答案 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
    }
);

Online check

答案 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);