C#从列表中删除数据

时间:2016-09-27 19:56:16

标签: c# list

所以我最近开始使用C#,现在我有一个在家做的项目......

我的情况是,我有一个数据文件,其中包含有关未定义数量的环的信息......他们的制造商,名称,金属,重量,尺寸,纯度和价格。

我已经阅读了文件......并将戒指分成了一个类似于以下的类:

class Rings
    {
        public string Maker { set; get; }
        public string Name { set; get; }
        public string Metal { set; get; }
        public string Weight { set; get; }
        public string Size { set; get; }
        public string Purity { set; get; }
        public string Price { set; get; }

        public Rings() { }
        public Rings(string maker, string name, string metal, string weight, string size, string purity, string price)
        {
            Maker = maker;
            Name = name;
            Metal = metal;
            Weight = weight;
            Size = size;
            Purity = purity;
            Price = price;
        }
    }

现在项目的最后一部分是找到并打印到文件环,价格低于300,尺寸为13或14 ......所以我想出了一个循环和一对夫妇的想法如果有功能从列表中删除所有不符合这些要求的戒指,然后只需打印出列表左边的内容...... 这是方法:

public static void SpecificRings(List<Rings> RingList)
        {

            foreach(var x in RingList)
            {
                int ThePrice = int.Parse(x.Price);
                int TheSize = int.Parse(x.Size);
                if (ThePrice >= 300)
                {
                    RingList.Remove(x);
                }
                else if (TheSize != 12 || TheSize != 13)
                {
                    RingList.Remove(x);
                }
            }
        }

现在的问题是我不知道如何从列表中删除实际的东西......我知道我需要制作7个RingList.Remove();但是如何指定要删除的信息?如果我没有充分解释这种情况,欢迎提出任何问题

2 个答案:

答案 0 :(得分:1)

首先,将Rings上的属性类型更改为它们实际表示的内容。这样你就可以对数据进行比较(比如,重量超过10克,价值不到100美元的戒指)。

class Rings
{
    public string Maker { set; get; }
    public string Name { set; get; }
    public string Metal { set; get; }
    public double Weight { set; get; }
    public float Size { set; get; }
    public string Purity { set; get; } //I don't know what this is... An int?
    public decimal Price { set; get; }

    public Rings() { }
    public Rings(string maker, string name, string metal, double weight, float size, string purity, decimal price)
    {
        Maker = maker;
        Name = name;
        Metal = metal;
        Weight = weight;
        Size = size;
        Purity = purity;
        Price = price;
    }
}

其次,请勿将其从列表中删除。只需返回一个包含您正在寻找的戒指的新列表。如果您想要找到一组特定的响铃,然后您决定要应用稍微不同的过滤器,该怎么办?不要重新阅读列表,只需重复使用它:

public static IEnumerable<Rings> FilterRings(IEnumerable<Rings> RingList, decimal price, string maker /* etc.......*/)
{
    return ringList.Where(r => r.Price <= price /* or > or == or whatever*/)
                   .Where(r => r.Maker == maker);
                 //.Where etc.. etc...
}

您甚至不需要上述功能。只需直接使用您要查找的内容调用Linq方法。

答案 1 :(得分:0)

你在这里遇到麻烦。首先,当您在foreach循环中枚举集合时,无法从集合中删除项目。

        foreach(var x in RingList)
        {
            int ThePrice = int.Parse(x.Price);
            int TheSize = int.Parse(x.Size);
            if (ThePrice >= 300)
            {
//  >>> Exception will be throw on next line
                RingList.Remove(x);

第二个问题是,您已经获得了一个戒指清单,并且您正在从中删除物品。然后他们就走了。这可能会引起混淆。

还有第三个问题:

if (TheSize != 12 || TheSize != 13)

这不会很好。每个戒指的大小不是12,不是大小13.如果它是13,它不是12;如果它是12,它不是13.那条线将丢弃一切。

认为你的意思是你想要只保留 尺寸12和13号戒指,但这是一个猜测。也许你想丢弃只有12号和13号?让我知道。

这是我要编写的函数的简化版本,用于执行您在SpecificRings中所执行的操作。你说你处于学习的早期阶段,所以我会尝试坚持你可能已经看过的东西。

首先,如果函数获得特定的响铃,请将其命名为GetSpecificRings()。编译器并不关心,但它可以更容易地跟踪您的代码在您自己的想法中做了什么。

但首先,让我们不要使用字符串:

class Rings
{
    public string Maker { set; get; }
    public string Name { set; get; }
    public string Metal { set; get; }
//  All these should be numbers
    public decimal Weight { set; get; }
    public decimal Size { set; get; }
    public decimal Purity { set; get; }
    public decimal Price { set; get; }

现在要获取我们的具体戒指:

public List<Rings> GetSpecificRings(List<Rings> rings)
{
    var rtn = new List<Rings>();

    foreach (var r in rings)
    {
        if (r.Price < 300 && (r.Size == 12 || r.Size == 13))
        {
            rtn.Add(r);
        }
    }

    return rtn;
}

然后你可以调用该函数来获取环的子集:

var myAffordableRingsInSomeSizes = GetSpecificRings(RingList);

我假设您从某个地方(如数据库)获取RingList,或者只是静态初始化它。如果需要,我们可以进一步研究。

这是另一种做同样事情的方法,使用你可能还没有学过的东西:

var sameResults = RingList.Where(r => 
            r.Price < 300 && (r.Size == 12 || r.Size == 13))
        ).ToList();

接受你的选择。