检查列表“ A”是否包含列表“ B”中的每个元素

时间:2019-03-13 16:00:18

标签: c#

听起来好像以前有人问过这个答案,但事实并非如此。我正在寻找一种检查列表“ A”是否包含列表“ B”中所有元素的方法,而我从以下问题得到了答案:Does .NET have a way to check if List a contains all items in List b?。无论哪种方式,我都对此解决方案有疑问。

我的列表“ A”可以具有一系列Item,这是一个对象,列表B也可以。如果列表B包含相同对象的2倍且我的列表“ A”,我希望我的代码返回false “ 1或更少。这段代码(摘自正确的答案):

return !RequiredItems.Except(Application._player.InventoryItems).Any();

仅检查元素是否在列表“ A”上至少存在一次。示例:

列表A:汽车

列表B:汽车,汽车

将返回true,因为列表A包含汽车,即使我希望它返回false除非它有2辆汽车。

是否有一种方法可以修改该代码以实现我想要的功能,或者有另一种方法可以实现此目的?

编辑: @HimBromBeere让我意识到我忘了说一些非常重要的事情了。列表A需要至少具有相同数量的元素才能实现目标。如果此列表A包含1000辆汽车,而列表B仅包含B,则它应返回true。如果列表A的列表B中的元素较少或没有元素(包括重复项),则只能返回false。

1 个答案:

答案 0 :(得分:1)

我可以想象这样的基于循环的方法:

<template>
    <v-form ref="form" v-model="valid">
        <v-text-field
            v-model="age"
            :rules="[age]"
            label="Label"
            required
        >
        </v-text-field>
        <v-btn
            color="primary"
            :disabled="!valid"
            @click="submit"
        >
        submit
        </v-btn>
        <v-btn 
            @click="clear"
        >
        clear
        </v-btn>
    </v-form>
</template>

<script>
    data(){
        return{
            min: 21,
            max: 65,
            valid: true,
        }  
    },
    methods:{
        clear() {
            this.$refs.form.reset()
        },
        age: (value) => {
           return this.min < value < this.max
        }
    }
</script>

它对bool areEqual = true; foreach(var g in listB.GroupBy(x => x)) { if(listA.Count(x => x == g.Key) >= g.Count()) { areEqual = false; break; } } 的所有重复项进行分组,并检查其数量是否至少等于listB中相同项目的数量。

这当然假定您的副本具有相同的参考。否则,您将必须执行一些相等性检查。