我想在我的项目中使用Linq来查询一个公交时刻表,这样在任何时候我都可以得到接下来的5个公交到达时间。如何将查询限制在前5个结果?
更一般地说,我如何在c#中获取一个列表的切片?(在Python中,我会使用mylist[:5]来获取前5个元素。)
我想在我的项目中使用Linq来查询一个公交时刻表,这样在任何时候我都可以得到接下来的5个公交到达时间。如何将查询限制在前5个结果?
更一般地说,我如何在c#中获取一个列表的切片?(在Python中,我会使用mylist[:5]来获取前5个元素。)
当前回答
像分页一样,你可以使用下面的公式来获取列表或元素的切片:
var slice = myList.Skip((pageNumber - 1) * pageSize)
.Take(pageSize);
例1:前五项
var pageNumber = 1;
var pageSize = 5;
例2:后五项
var pageNumber = 2;
var pageSize = 5;
例3:第三五项
var pageNumber = 3;
var pageSize = 5;
如果注意到公式参数pageSize = 5和pageNumber正在改变,如果你想改变切片中的项目数,你改变pageSize。
其他回答
像分页一样,你可以使用下面的公式来获取列表或元素的切片:
var slice = myList.Skip((pageNumber - 1) * pageSize)
.Take(pageSize);
例1:前五项
var pageNumber = 1;
var pageSize = 5;
例2:后五项
var pageNumber = 2;
var pageSize = 5;
例3:第三五项
var pageNumber = 3;
var pageSize = 5;
如果注意到公式参数pageSize = 5和pageNumber正在改变,如果你想改变切片中的项目数,你改变pageSize。
要获得前5个元素,最好使用这样的表达式:
var firstfivearrival = myList.Where([表达式]).Take(5);
or
var firstfivearrival = myList.Where([表达式]). take(5)。OrderBy (EXPR)(命令);
它将比orderBy变体更快,因为LINQ引擎由于执行延迟而不会扫描所有列表,并且不会对所有数组进行排序。
class MyList : IEnumerable<int>
{
int maxCount = 0;
public int RequestCount
{
get;
private set;
}
public MyList(int maxCount)
{
this.maxCount = maxCount;
}
public void Reset()
{
RequestCount = 0;
}
#region IEnumerable<int> Members
public IEnumerator<int> GetEnumerator()
{
int i = 0;
while (i < maxCount)
{
RequestCount++;
yield return i++;
}
}
#endregion
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
#endregion
}
class Program
{
static void Main(string[] args)
{
var list = new MyList(15);
list.Take(5).ToArray();
Console.WriteLine(list.RequestCount); // 5;
list.Reset();
list.OrderBy(q => q).Take(5).ToArray();
Console.WriteLine(list.RequestCount); // 15;
list.Reset();
list.Where(q => (q & 1) == 0).Take(5).ToArray();
Console.WriteLine(list.RequestCount); // 9; (first 5 odd)
list.Reset();
list.Where(q => (q & 1) == 0).Take(5).OrderBy(q => q).ToArray();
Console.WriteLine(list.RequestCount); // 9; (first 5 odd)
}
}
工作的例子:
[Test]
public void TestListLinqTake()
{
List<string> elements = new List<string>() { "storm", "earth", "fire"};
List<string> noErrorThrown = elements.Take(5).ToList();
List<string> someElements = elements.Take(2).ToList();
Assert.True(
someElements.First().Equals("storm") &&
someElements.Count == 2 &&
noErrorThrown.Count == 3);
}
不要忘记
using System.Linq;
根据Bellarmine Head的评论
如果有人感兴趣(即使问题不要求这个版本),在c# 2中将是:(我已经编辑了答案,以下是一些建议)
myList.Sort(CLASS_FOR_COMPARER);
List<string> fiveElements = myList.GetRange(0, 5);
var firstFiveItems = myList.Take(5);
或切:
var secondFiveItems = myList.Skip(5).Take(5);
当然,通常按照某种顺序获取前五项是很方便的:
var firstFiveArrivals = myList.OrderBy(i => i.ArrivalTime).Take(5);