我有一个像
这样的清单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解决方案。
答案 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)
请勿使用var
和object
。试试这个:
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;
}
}
}
这确实比您需要的更多。但是,它可能在将来有所帮助。