如何使用 linq 执行此操作?

时间:2021-01-07 18:17:48

标签: c# linq

busLineStation 的类型为:IEnumerable<object1>dl.ConsecutivesStations() 的类型为:IEnumerable<object2>

foreach (var item in busLineStation)
{
    foreach (var item2 in dl.ConsecutivesStations())
    {
        if (item.BusStationKey == item2.StationCodeOne)
            item.BusStationKeyNext = item2.StationCodeTwo;
        if (item.BusStationKey == item2.StationCodeTwo)
            item.BusStationKeyPrevious = item2.StationCodeOne;
    }
}

3 个答案:

答案 0 :(得分:0)

使用 LINQ 并不总是一种改进,尤其是在您修改数据时 - 它仅用于查询数据。

下面是一个用LINQ查询数据然后修改的实现——我觉得很难理解,复杂,而且运行会比较慢:

foreach (var bs1s2c1c2 in busLineStation.SelectMany(b => dl.ConsecutivesStations().Select(d => (b, b.BusStationKey, d.StationCodeOne, d.StationCodeTwo)))
                                       .Select(bks1s2 => (bks1s2.b, bks1s2.StationCodeOne, bks1s2.StationCodeTwo, c1: bks1s2.BusStationKey == bks1s2.StationCodeOne, c2: bks1s2.BusStationKey == bks1s2.StationCodeTwo))
                                       .Where(bs1s2c1c2 => bs1s2c1c2.c1 || bs1s2c1c2.c2)) {
    if (bs1s2c1c2.c1)
        bs1s2c1c2.b.BusStationKeyNext = bs1s2c1c2.StationCodeTwo;
    if (bs1s2c1c2.c2)
        bs1s2c1c2.b.BusStationKeyPrevious = bs1s2c1c2.StationCodeOne;
}

注意:我使用 ValueTuple 来缓存值和测试结果,所以我不会访问或测试两次,但以额外的方法调用和 lambda 调用为代价,所以它可能不会更快.

答案 1 :(得分:0)

我将建议一个完全不同的结构。与其先经过车站,然后在整个路线中搜索下一站和上一站,不如按顺序穿过车站,然后边走边设置上一个/下一个?

如果您确定车站已经安排妥当,您当然可以跳过 $('selector').unbind('dblclick') 部分。

OrderBy()

答案 2 :(得分:0)

我同意其他人的意见,即 Linq 降低了可读性。

如果 .ToList() 是 List<> 以及 IEnumerable<>

也可以取出
    busLineStation.ToList().ForEach(item => dl.ConsecutivesStations().ToList().ForEach(item2 => {
        if (item.BusStationKey == item2.StationCodeOne) item.BusStationKeyNext = item2.StationCodeTwo;
        if (item.BusStationKey == item2.StationCodeTwo) item.BusStationKeyPrevious = item2.StationCodeOne;
    }));
相关问题