0

我有一个自定义列表类,可以说,

public class Fruit
{
    public string Name { get; set; }
    public string Size { get; set; }
    public string Weight{ get; set; }
}

现在我像这样向它添加记录,

 List<Fruit> Fruits= new List<Fruit>();

 //some foreach loop 
 Fruit fruit = new Fruit();
 fruit.Name = ...;
 fruit.Size = ...;
 fruit.Weight = ...;

 Fruits.Add(fruit);

我想要的是 ?

我想以检查自定义列表中的任何水果是否已经具有相同重量的方式进行更改,Public Fruit Class然后忽略它并继续,例如不要将其添加到列表中。

我宁愿在不改变 foreach 循环逻辑的情况下这样做

4

3 回答 3

7

使用 LINQ .Any()- 确定序列的任何元素是否存在或是否满足条件。(MSDN:http: //msdn.microsoft.com/en-us/library/system.linq.enumerable.any.aspx

if (!Fruits.Any(f => fruit.Weight != null && f.Weight == fruit.Weight))
   Fruits.Add(fruit);
于 2013-11-05T14:11:56.160 回答
1

如果不允许重复权重,我将使用HashSet<Fruit>a 自定义IEqualityComparer

public class FruitWeightComparer : IEqualityComparer<Fruit>
{
    public bool Equals(Fruit x, Fruit y)
    {
        if(x == null || y== null) return false;
        if (Object.ReferenceEquals(x, y)) return true;
        return x.Weight == y.Weight;
    }

    public int GetHashCode(Fruit obj)
    {
        return obj.Weight == null ? 0 : obj.Weight.GetHashCode();
    }
}

现在您可以将HashSet构造函数与此比较器一起使用:

HashSet<Fruit> Fruits = new HashSet<Fruit>(new FruitWeightComparer());
// ...
bool notInSet = Fruits.Add(fruit); 

HashSet.Add如果可以添加项目,则返回 true。

于 2013-11-05T14:15:54.023 回答
0

您可以在插入时通过简单地不插入已经存在的水果来控制它

if (!myFruits.Any(f => f.Weight == newFruit.Weight))
   myFruits.Add(newFruit);

如果您无法操作插入逻辑,则可以创建一个自定义列表,该列表包含一个普通的List<T>并更改Add上述示例中的行为:

public class FruitsWithDistinctWeightList : IEnumerable<Fruit>
{  
    private List<Fruit> internalList;

    ... // Constructor etc.

    public void Add(Fruit fruit)
    {
       if (!internalList.Any(f => f.Weight == fruit.Weight))
         internalList.Add(fruit);
    }       

    ... // Further impl of IEnumerable<Fruit> or IList<Fruit>
}

您还可以使用一些不允许重复项的现有集合。例如一些基于哈希的集合,例如HashSet<Fruit>

var fruitsWithDistinctWeight = new HashSet<Fruit>(new FruitWeightComparer());

你会使用一个比较器说重量相等的水果是相等的:

public class FruitWeightComparer : IEqualityComparer<Fruit>
{
   public bool Equals(Fruit one, Fruit two)
   {
        return one.Weight == two.Weight;
   }

   public int GetHashCode(Fruit item)
   {
        return one.Weight.GetHashCode();
   }
}

请注意, aHashSet<T>不像列表那样排序。请注意,为简单起见,上面的所有代码都假设设置了 Weight 字段。如果您的班级有公共设置者(即不保证这一点),则必须进行适当的更改。

于 2013-11-05T14:21:10.067 回答