用于检查重复项(不同对象、不同字段)的通用C#函数

用于检查重复项(不同对象、不同字段)的通用C#函数,c#,function,generics,C#,Function,Generics,我想创建一个通用函数,该函数获取三个参数(对象列表、属性名和值)。。。该函数必须检查重复项。 因此: 我有两个列表对象。。。一个具有多个A类对象,另一个具有多个B类对象 List <A> listOfA List <B> listOfB 我该怎么做 如果相同的函数也可以用于具有整数秩的C类,则最好使用: class C { public string description; public int rank; } List <C> listO

我想创建一个通用函数,该函数获取三个参数(对象列表、属性名和值)。。。该函数必须检查重复项。 因此:

我有两个列表对象。。。一个具有多个A类对象,另一个具有多个B类对象

List <A> listOfA
List <B> listOfB
我该怎么做

如果相同的函数也可以用于具有整数秩的C类,则最好使用:

class C  {
   public string description;
   public int rank;
}

List <C> listOfC

bool hasDuplicateRank = CheckDuplicate (listOfC, "rank", 2);
C类{
公共字符串描述;
公共int等级;
}
列表
bool hasDuplicateRank=CheckDuplicate(listOfC,“rank”,2);

您需要使用反射(需要导入
System.Reflection
):


您可以创建一个函数,其中包含一个通用列表和一个func,指向要比较的属性,并传入要比较的值,如下所示:

public bool CheckDuplicate(IEnumerable items,
Func属性选择器,
对象值)=>
Count(x=>propertySelector(x).Equals(value))>1;
然后像这样消费:

bool hasdeplicate缩写=CheckDuplicate(listOfA,x=>x.缩写,“ALG”);
但最简单(也是推荐的)解决方案是直接在列表上使用LINQ扩展方法,而不是像这样:

boolhasdeplication缩写=listOfA.Count(x=>x.缩写==“ALG”)>1;

关于LINQ的更多信息

请添加一个输入和所需输出的示例,为什么不简单地使用
任何
if(list.Any(v=>v.Prop==value)){/*duplicate found*/}
@ZoharPeled正如用户所说的一般函数,所以我假设他们希望能够使用变量属性(或字段)name@AshkanMobayenKhiabani
任何
都是通用的…@ZoharPeled,我不是这个意思。我的意思是,他正在寻找一种通用方法,可以接受任何类型和任何属性的名称进行检查。在他的例子中,他尝试使用不同的类型,每次使用不同的属性名称:listOfA,“缩写”-listOfB,“名称”-listOfB,“描述”。我使用了很多代码。。。谢谢,让它工作起来了!我的帖子被大大简化了,输入由4个列表组成,而不是1个,在唯一检查之前需要先处理这些列表。。。但是从这条线索中得到了很多灵感,所以每个人的评论都帮助了艾尔很多。。。又是thx。
bool hasDuplicateAbbreviation = CheckDuplicate (listOfA, "abbreviation", "ALG");
bool hasDuplicateName = CheckDuplicate (listOfB, "name", "Mrs. Smith");
bool hasDuplicateDescription = CheckDuplicate (listOfB, "description", "Nice toolkit");
class C  {
   public string description;
   public int rank;
}

List <C> listOfC

bool hasDuplicateRank = CheckDuplicate (listOfC, "rank", 2);
public static int CheckDuplicate<T>(IEnumerable<T> input, string field, object value)
{
    int count = 0;
    Type type = typeof(T);
    foreach(var item in input)
    {
        var fieldInfo = type.GetField(field);
        if(fieldInfo!= null)
            if(fieldInfo.GetValue(item) == value) count++;
        else
        {
            var propInfo = type.GetProperty(field);
            if(propInfo != null && propInfo.GetValue(item) == value) count++;
        }
    }
    return count;
}
if(CheckDuplicate(a, "abbreviation", "abbr1") > 1)
{
    // there is a duplicate
}