如何取一条记录而跳过其余的c#

本文关键字:何取 一条 记录 | 更新日期: 2023-09-27 18:14:06

我试着取一条记录,跳过其余的。我的代码没有抛出任何错误,但没有给出任何输出。这是我的代码。所以请看看并告诉我我的代码有什么问题。

public sealed class Person
{
    public Person() { }
    public Person(string name,bool HQ) {
        this.Name = name;
        this.HQ = HQ;
    }
    private string _Name;
    public string Name
    {
        get { return _Name; }
        set { _Name = value; }
    }
    private bool _HQ;
    public bool HQ
    {
        get { return _HQ; }
        set { _HQ = value; }
    }
}
  protected void btn_Click(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Name",typeof(string));
        dt.Columns.Add("HQ", typeof(bool));
        DataRow dr = null;
        dr = dt.NewRow();
        dr["Name"]="Arijit";
        dr["HQ"]=true;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr["Name"] = "Dibyendu";
        dr["HQ"] = false;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr["Name"] = "Tridip";
        dr["HQ"] = false;
        dt.Rows.Add(dr);

        List<Person> oPerson1 = (from c in dt.AsEnumerable()
            select new Person
            {
                Name = c.Field<string>("Name"),
                HQ = c.Field<bool>("HQ")
            }).Skip(1).Take(2).ToList();

        List<Person> oPerson2 = (from c in dt.AsEnumerable()
            select new Person
            {
                Name = c.Field<string>("Name"),
                HQ = c.Field<bool>("HQ")
            }).Take(1).Skip(2).ToList();
    }

如何取一条记录而跳过其余的c#

如果你想取第一条记录,你可以称它们为Take(1), First(), FirstOrDefault()

如果您想在中间取1条记录,请调用:Skip(n).Take(1),其中n -是跳过记录的数量

当你调用Take(n)时-之后不需要调用Skip,它已经选择了n条记录

试试这段代码。

Person oPerson1 = (from c in dt.AsEnumerable()
select new Person
{
    Name = c.Field<string>("Name"),
    HQ = c.Field<bool>("HQ")
}).First(); //first person in a list

Person oPerson2 = (from c in dt.AsEnumerable()
select new Person
{
    Name = c.Field<string>("Name"),
    HQ = c.Field<bool>("HQ")
}).Skip(1).First(); //second person in a list
However this code can be rewritten to be clearer:
List<Person> persons = from c in dt.AsEnumerable()
select new Person
{
    Name = c.Field<string>("Name"),
    HQ = c.Field<bool>("HQ")
};
Person oPerson1 = persons[0];
Person oPerson2 = persons[1];

我更喜欢使用IQueryable而不是List

无论如何你可以使用Queryable。跳过需要的元素数目

   IQueryable<Person> oPerson2 = (from c in dt.AsEnumerable()
            select new Person
            {
                Name = c.Field<string>("Name"),
                HQ = c.Field<bool>("HQ")
            }).Skip(2).Take(1);

你也可以在Return或Skip Elements in a Sequence (LINQ to SQL)

中找到更多相关信息。

我不确定你所说的"取一个,跳过其余的"是什么意思,但我怀疑你混淆了LINQ操作的工作方式。它们根据您指定的条件返回一个序列,并且该新序列只包含您所要求的内容。

例如,如果您有一个包含三个项目的List,并且调用Take(1),则返回一个包含1个项目的IEnumerable。没有什么可以"跳过"的了,因为你的列表中只有一个元素。原始数据表保持不变——LINQ序列是不可变的。

听起来你真正想做的是:

    List<Person> oPerson2 = (from c in dt.AsEnumerable()
        select new Person
        {
            Name = c.Field<string>("Name"),
            HQ = c.Field<bool>("HQ")
        }).Take(1).ToList();

当然,这在LINQ中是一个非常常见的操作,所以还有另一种更"清晰"的方法:

    Person oPerson2 = (from c in dt.AsEnumerable()
        select new Person
        {
            Name = c.Field<string>("Name"),
            HQ = c.Field<bool>("HQ")
        }).First();

如果您只想获得一条记录,您应该用First()FirstOrDefault()替换最后的ToList调用,它们在这里就是为了这个目的。两个方法之间的区别是,First()将抛出异常,如果没有返回(例如空集合)。FirstOrDefault()将返回default(T)(例如,类为null,值类型为0)。

打破链接然后:

List<Person> oPerson2 = (from c in dt.AsEnumerable()
  select new Person
  {
    Name = c.Field<string>("Name"),
    HQ = c.Field<bool>("HQ")
  }).Take(1).Skip(2).ToList();

就变成:

var tmp0 = (from c in dt.AsEnumerable()
  select new Person
  {
    Name = c.Field<string>("Name"),
    HQ = c.Field<bool>("HQ")
  });
var tmp1 = tmp0.Take(1);
var tmp2 = tmp1.Skip(2);
List<Person> oPerson2 = tmp2.ToList();

这样更容易看到错误。Tmp0是一个枚举对象,枚举时将返回所有可能的行。Tmp1是一个枚举数,它只返回tmp0中的第一个1行(如果行数不够,则返回更少)。Tmp2是一个可枚举对象,它将跳过tmp1中的前2行(如果行数不够,则跳过更少),然后返回其余的行。最后,oPerson2使这些可枚举对象实际返回它们的结果,并将其存储在一个列表中。

从这里可以明显看出,错误是.Skip(2),因为它采用单元素枚举并跳过2并留下其余部分,导致max(1 - 2,0) = 0元素的列表。

省略Skip(),你得到你想要的,因为"take up to 1"已经意味着"跳过其余部分"。

也可以使用.First()来实现这个

List<X> xlist= XBusiness.GetAllX(xname.ToString());
X lastX = xlist.First();