Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有Linq操作来从项目列表中检索特定项目,其中项目的属性值应该是唯一的?_C#_Linq - Fatal编程技术网

C# 是否有Linq操作来从项目列表中检索特定项目,其中项目的属性值应该是唯一的?

C# 是否有Linq操作来从项目列表中检索特定项目,其中项目的属性值应该是唯一的?,c#,linq,C#,Linq,我有一个自定义对象的列表。此自定义类型有一个名为Name的属性,该属性在列表中应该是唯一的。换句话说,列表中的任何两项的Name属性的值都不应相同 当我验证此列表时,我希望检索有问题的项。有允许我这样做的Linq操作吗 我想要像这样的东西 listOfItems.Where(x => x.Name.Equals(/*anything else in this list with the same value for name */) 基本上,我试图避免针对列表中的每个项目检查整个列表(在

我有一个自定义对象的
列表。此自定义类型有一个名为
Name
的属性,该属性在列表中应该是唯一的。换句话说,列表中的任何两项的
Name
属性的值都不应相同

当我验证此列表时,我希望检索有问题的项。有允许我这样做的Linq操作吗

我想要像这样的东西

listOfItems.Where(x => x.Name.Equals(/*anything else in this list with the same value for name */)
基本上,我试图避免针对列表中的每个项目检查整个列表(在嵌套的foreach中):

private IList GetDuplicatedTypeNames(IList customObjectsToFindDuplicatesIn)
{
var duplicatedList=新列表();
foreach(customObjectsToFindDuplicatesIn中的var customObject)
foreach(customObjectsToFindDuplicatesIn中的var innerCustomObject)
if(customObject==innerCustomObject&&customObject.Name.Equals(innerCustomObject.Name))
重复列表。添加(customObject);
返回重复列表;
}

(编辑)注意:我只能按域规则使用列表,而不能使用字典。

那么为什么不使用字典而不是列表,并使用Name属性作为键呢?这样,就根本无法将名称复制到集合中,因为会引发异常

此外,在添加名称之前,可以使用该方法测试名称是否已在词典中


这种方法的优点是,它比扫描列表中的重复项要快得多。

那么,为什么不使用字典而不是以Name属性为键的列表呢?这样,就根本无法将名称复制到集合中,因为会引发异常

此外,在添加名称之前,可以使用该方法测试名称是否已在词典中


这种方法的优点是,它比扫描列表中的重复项快得多。

获取重复项的名称:

 var duplicates = listOfItems
        .GroupBy(i => i.Name)
        .Where(g => g.Count() > 1)
        .Select(g => g.Key);
编辑:获取重复项目:

var duplicates = listOfItems
    .GroupBy(i => i.Name)
    .Where(g => g.Count() > 1)
    .SelectMany(g => g);

获取重复项的名称:

 var duplicates = listOfItems
        .GroupBy(i => i.Name)
        .Where(g => g.Count() > 1)
        .Select(g => g.Key);
编辑:获取重复项目:

var duplicates = listOfItems
    .GroupBy(i => i.Name)
    .Where(g => g.Count() > 1)
    .SelectMany(g => g);

这将返回一个对象列表

class foo
{
    public string Name { get; set; }

    public override string ToString()
    {
        return Name;
    }
}

class fooEqualityComparer : IEqualityComparer<foo>
{
    public bool Equals(foo x, foo y)
    {
        if (x == null || y == null)
            return false;
        return x.Name == y.Name;
    }

    public int GetHashCode(foo obj)
    {
        return obj.Name.GetHashCode();
    }
}


var duplicates = listOfItems
.GroupBy(x => x, new fooEqualityComparer())
.Where(g => g.Count() > 1)
.SelectMany(g => g);
class-foo
{
公共字符串名称{get;set;}
公共重写字符串ToString()
{
返回名称;
}
}
类别fooEqualityComparer:IEqualityComparer
{
公共布尔等于(foo x,foo y)
{
如果(x==null | | y==null)
返回false;
返回x.Name==y.Name;
}
公共int GetHashCode(foo obj)
{
返回obj.Name.GetHashCode();
}
}
var duplicates=listOfItems
.GroupBy(x=>x,新的fooEqualityComparer())
.Where(g=>g.Count()>1)
.SelectMany(g=>g);

这将返回一个对象列表

class foo
{
    public string Name { get; set; }

    public override string ToString()
    {
        return Name;
    }
}

class fooEqualityComparer : IEqualityComparer<foo>
{
    public bool Equals(foo x, foo y)
    {
        if (x == null || y == null)
            return false;
        return x.Name == y.Name;
    }

    public int GetHashCode(foo obj)
    {
        return obj.Name.GetHashCode();
    }
}


var duplicates = listOfItems
.GroupBy(x => x, new fooEqualityComparer())
.Where(g => g.Count() > 1)
.SelectMany(g => g);
class-foo
{
公共字符串名称{get;set;}
公共重写字符串ToString()
{
返回名称;
}
}
类别fooEqualityComparer:IEqualityComparer
{
公共布尔等于(foo x,foo y)
{
如果(x==null | | y==null)
返回false;
返回x.Name==y.Name;
}
公共int GetHashCode(foo obj)
{
返回obj.Name.GetHashCode();
}
}
var duplicates=listOfItems
.GroupBy(x=>x,新的fooEqualityComparer())
.Where(g=>g.Count()>1)
.SelectMany(g=>g);

My List是可视化网格的后端数据源。用户在网格中编辑值,我希望在运行中进行验证。字典将不必要地使数据源复杂化。此外,由于域模型的工作方式,我也受到这个规则的限制。从描述来看,似乎有一个允许重复的
列表
,询问者想知道这些重复足够公平,我不知道您的情况不允许使用字典。。但是您应该在问题中指定它。我的列表是可视化网格的后端数据源。用户在网格中编辑值,我希望在运行中进行验证。字典将不必要地使数据源复杂化。此外,由于域模型的工作方式,我也受到这个规则的限制。从描述来看,似乎有一个允许重复的
列表
,询问者想知道这些重复足够公平,我不知道您的情况不允许使用字典。。但是您应该在问题中指定。这将只返回重复项的名称。这将只返回重复项的名称。您的原始循环中似乎有一个bug。它应该是这样的:if(customObject!=innerCustomObject&&…)看起来您的原始循环中有一个bug。它应该是:if(customObject!=innerCustomObject&&…)