如何获取List <t> </t>的前一个元素

时间:2015-04-01 09:43:26

标签: c# linq list

我有一个像

这样的清单
var myList = new List<object> { 
    new { Day = "Sunday", ID = 15 },
    new { Day = "Monday", ID = 20 }, 
    new { Day = "Tuesday", ID = 80 } 
};

现在我想获得给定ID的前一天。 例如80导致星期一和星期日应该是20的结果。列表按ID排序!

我有一个简单的方法来确定日值吗?理想的是一个linq解决方案。

6 个答案:

答案 0 :(得分:6)

var result = myList.LastOrDefault(item => item.ID < 80);

答案 1 :(得分:3)

快点肮脏 方式:

myList.Where(c => c.ID < currentId).OrderByDescending(c => c.ID)
     .Select(c => c.Day).FirstOrDefault();

答案 2 :(得分:1)

myList.TakeWhile(o => o.ID <= givenID).Select(o => o.Day).LastOrDefault();

这是假设myList已订购。否则你可以投入OrderBy()

答案 3 :(得分:0)

var item = myList.Single(l => l.ID == 80);
var i = myList.IndexOf(item);
var j = (i - 1) % myList.Count;

var prevItem = myList[j];

这将获取您正在搜索的项目,在列表中找到它的索引,减去一个(模数允许您环绕列表的末尾),然后获取上一个项目从索引列表中。

编辑:使用索引而不是像FindLast这样的东西,您可以不需要ID值按日期升序排列。例如星期一可能是100和星期二15,它不会有所作为。

答案 4 :(得分:0)

请勿使用varobject。试试这个:

private class ItemList
{

    /// <summary>
    /// Day
    /// </summary>
    public string Day { get; set; }

    /// <summary>
    /// ID
    /// </summary>
    public int ID { get; set; }

}

List<ItemList> myList = new List<ItemList> { 
    new ItemList() { Day="S", ID=10 },
    new ItemList() { Day="M", ID=20 },
    new ItemList() { Day="T", ID=30 },
};

foreach(ItemList key in myList)
{
    ItemList result = myList.FindLast(x=>x.ID<key.ID);
    if(result!=null)
    {
        MessageBox.Show("Prev ID: " + result.ID.ToString());
    }
}

答案 5 :(得分:0)

(基于Calculate difference from previous item with LINQ

以纯粹的linq方式查找prev值

var value = myList.SelectWithPrevious((prev, cur) => new { prev = prev, cur= cur}).Where((w) => w.cur.ID == 80).First();
            Console.WriteLine(value.prev.Day);

扩展名

public static IEnumerable<TResult> SelectWithPrevious<TSource, TResult> (this IEnumerable<TSource> source,Func<TSource, TSource, TResult> projection)
{
    using (var iterator = source.GetEnumerator())
    {
        if (!iterator.MoveNext())
        {
            yield break;
        }
        TSource previous = iterator.Current;
        while (iterator.MoveNext())
        {
            yield return projection(previous, iterator.Current);
            previous = iterator.Current;
        }
    }
}

这确实比您需要的更多。但是,它可能在将来有所帮助。