C# 林克';在列表中的特定属性上设置s Distinct()

C# 林克';在列表中的特定属性上设置s Distinct(),c#,linq,C#,Linq,所以当我看到我有时会有重复的单词时,我正在为孩子们做一个阅读游戏。所以我对自己说,让我们做一个明确的决定。但它有点复杂 因此,我了解如何在整数或字符串列表上使用Distinct,以及如何在列表中的属性上使用DistinctBy() 但我不知道如何在对象列表中的字符串列表中的属性上执行此操作 方案B是一个有很多前肢疼痛的洞,但我正在寻找更优雅的东西 这就是结构: List<MyObject>() { OtherObject BsObject1; OtherObject

所以当我看到我有时会有重复的单词时,我正在为孩子们做一个阅读游戏。所以我对自己说,让我们做一个明确的决定。但它有点复杂

因此,我了解如何在整数或字符串列表上使用Distinct,以及如何在列表中的属性上使用DistinctBy()

但我不知道如何在对象列表中的字符串列表中的属性上执行此操作

方案B是一个有很多前肢疼痛的洞,但我正在寻找更优雅的东西

这就是结构:

List<MyObject>()
{
    OtherObject BsObject1;
    OtherObject BsObject2;
    List<String>();
}
List()
{
其他对象BsObject1;
其他对象BsObject2;
List();
}
因此日期如下所示:

MyObject1: List<String>: "word1", "word2"
MyObject2: List<String>: "word3", "word4"
MyObject3: List<String>: "word1", "word5"
MyObject4: List<String>: "word5", "word6"
MyObject1:列表:“word1”、“word2”
MyObject2:列表:“word3”、“word4”
MyObject3:列表:“word1”、“word5”
MyObject4:列表:“word5”、“word6”

只要在任何其他列表中有一个单词,就可以删除该对象


有什么想法吗?

基于您的问题,我假设在您的示例中,唯一剩下的对象是MyObject2,因为word1存在于对象1和3中,word5存在于对象3和4中

List<MyObject> objects; // Populate your data here... Strings is the name of the List<String> property.
var distinctObjects = objects.Where(
    mo => !mo.Strings.Intersect(
        objects.Except(new List<MyObject>() { mo }).SelectMany(mobj => mobj .Strings))
    .Any()).ToList();
列出对象;//在此处填充您的数据。。。Strings是列表属性的名称。
var distinctObjects=对象。其中(
mo=>!mo.Strings.Intersect(
objects.Except(new List(){mo}).SelectMany(mobj=>mobj.Strings))
.Any()).ToList();

此语句检查每个项的字符串列表中的字符串是否包含在所有其他项中的字符串的并集中。如果该项不是空的(!Any()),则该项将保留。

“只要其他列表中有一个单词,该对象就可以被删除。”你真的是说整个对象都可以被删除吗?如果您有
MyObject5:List:“word6”、“word7”
,该怎么办
MyObject 5
已经有一个“word6”,但“word7”在其他任何地方都不存在。在这种情况下,您要删除哪个对象
MyObject4
和删除一起丢失“word5”,或者
MyObject5
和删除“word7”?如果您的意思是可以删除该单词,那么为什么不将所有单词
.Concat()
然后
.Distinct()
?请注意,根据您的定义,输出是未定义的。考虑这个数据集<代码> [a,b],[b,c],[c,d] ] < /代码>。前两个对象共享一个项(B),第二个和第三个对象共享一个项(C),但第一个和第三个对象不共享。如果先比较前两个,然后再比较后两个,则结果是
[[A,B],[C,D]
,如果先比较第二个和第三个,则结果是
[[A,B],[B,C]
,如果进行第二次传递,则结果是
[[A,B]]
。现在,比较项目的顺序会改变结果。我建议您在
哈希集中跟踪使用过的单词,然后仅当其单词不在使用过的单词列表中时,才将对象添加到列表中(并将其单词添加到使用过的单词列表中)。*itsme86在这种情况下,MyObject 5将被删除。如果我先浓缩然后分离,那么我就会失去我所需要的结构。这不是一个选择*Servy甚至没有想到这一点。我想这个洞的问题是有缺陷的,我必须在添加所有数据之前修复它。就像斯莱建议的那样*这确实是一个很好的解决办法。TXY您可以在推荐中使用@userNameWithoutSpaces来通知要通知的人(或者单击“添加注释”按钮下方的“帮助”以获取示例)。如果你有机会从单词列表中随机挑选单词,你可以随意移动列表(在列表的随机位置交换单词),然后按顺序排列