C# 选择唯一的元素
我有以下课程:C# 选择唯一的元素,c#,list,C#,List,我有以下课程: public class Test { public string ColumnA { get; set; } public int ColumnB { get; set; } public int ColumnC { get; set; } } a下列清单: List<Test> testList = new List<Test>() { new Test() { ColumnA = "Element 1", Co
public class Test
{
public string ColumnA { get; set; }
public int ColumnB { get; set; }
public int ColumnC { get; set; }
}
a下列清单:
List<Test> testList = new List<Test>()
{
new Test() { ColumnA = "Element 1", ColumnB = 1, ColumnC = 3 },
new Test() { ColumnA = "Element 2", ColumnB = 2, ColumnC = 2 },
new Test() { ColumnA = "Element 3", ColumnB = 1, ColumnC = 3 },
new Test() { ColumnA = "Element 4", ColumnB = 4, ColumnC = 4 },
new Test() { ColumnA = "Element 5", ColumnB = 5, ColumnC = 5 },
new Test() { ColumnA = "Element 6", ColumnB = 7, ColumnC = 0 },
new Test() { ColumnA = "Element 7", ColumnB = 7, ColumnC = 0 }
};
List testList=newlist()
{
新测试(){ColumnA=“Element 1”,ColumnB=1,ColumnC=3},
新测试(){ColumnA=“Element 2”,ColumnB=2,ColumnC=2},
新测试(){ColumnA=“Element 3”,ColumnB=1,ColumnC=3},
新测试(){ColumnA=“Element 4”,ColumnB=4,ColumnC=4},
新测试(){ColumnA=“Element 5”,ColumnB=5,ColumnC=5},
新测试(){ColumnA=“Element 6”,ColumnB=7,ColumnC=0},
新测试(){ColumnA=“Element 7”,ColumnB=7,ColumnC=0}
};
因此,我只想选择唯一的元素(B列和C列与其他元素不同),即:“元素2”、“元素4”和“元素5”
Obs:我不想带不同的元素,重复的元素,我不想带,两者都带
如何才能做到这一点?使用Linq选择没有重复项的元素:
Test[] noDupes = testList.Where(item =>
!testList.Except(new[] { item }).Any(inner => inner.Equals(item))
).ToArray();
(当然,这假设您已经在测试上实现了等于。那么lambda呢
List<Test> answer = testList.Where(t => t.ColumnB == t.ColumnC).ToList();
List-answer=testList.Where(t=>t.ColumnB==t.ColumnC.ToList();
只需使用ElementB
和ElementC
属性进行分组,并从只有一个元素的组中获取元素(这意味着它们是唯一的)。可以编写
List<Test> data = testList.FindAll(test => test.ColumnB == test.ColumnC);
List data=testList.FindAll(test=>test.ColumnB==test.ColumnC);
方法FindAll
由于是列表的成员而得到优化。当我们使用distinct时,FindAll
只带来一个重复元素,对吗?例如,列表:1,1,2,3,4,5,5,6,如果我使用distinct,我会有另一个带有1,2,3,4,5,6的列表,Right?但是,在我的例子中,我的目标是只带2,3,4和6,因为1和5是重复的。明白吗?你的编辑毫无意义。它不会返回任何内容,因为在Any
调用中,您总是会找到至少一个元素,这与您在Where
迭代中实际比较的元素相同。@MarcinJuraszek是的,对。我刚刚在其中添加了一个Except
当前项,这应该可以解决这个问题。仍然不是更好,因为Except
需要IEnumerable
,并且您试图将它仅用于一个元素。问题的目标不是使B列和C列相等的元素,目标是“只选择唯一的元素”(B列和C列与其他元素相比不一样)”而不是它本身。我不明白(B列和C列与其他元素相比不一样)”到底是什么意思
List<Test> data = testList.FindAll(test => test.ColumnB == test.ColumnC);