我有一系列元素 字符串[]:
new string[] { "A", "B", "C", "D" }
还有一个由几个序列组成的对象 对象:
List<Test> obj = new List<Test>()
{
new Test() {Lists = new List<string>() { "A", "B" } },
new Test() {Lists = new List<string>() { "A", "C" } },
new Test() {Lists = new List<string>() { "C" } }
};
我想在所有对象集合中找到丢失的元素(“ D” )。 那就是我得到的:
private static List<string> FindeMissingElements()
{
string nonExistentElement = null;
List<string> nonExistentElements = new List<string>();
foreach (var elemArr in arr)
{
foreach (var elemObj in obj)
{
if (elemObj.Lists.Any(a => a.Contains(elemArr)))
{
nonExistentElement = null;
break;
}
nonExistentElement = elemArr;
}
if (nonExistentElement != null)
nonExistentElements.Add(nonExistentElement);
}
return nonExistentElements;
}
我想简化代码并尽可能使用LINQ ...
答案 0 :(得分:1)
//展开复杂对象-将复杂对象中的所有元素都放入IEnumerable集合中 //整理清单-
var listB =(从obj中的lm选择lm.Lists).SelectMany(it => it.ToList());
//下面的A是输入元素 //使用IEnumerable,但扩展名如下所示-missingElements IEnumerable将使您的元素来自复杂对象-
string [] listA =新的string [] {“ A”,“ B”,“ C”,“ D”,“ E”}; var missinElements = listA.Except(listB);
答案 1 :(得分:1)
首先,我将把源展平到一个列表中,以便收集实际值。为此,最好使用SelectMany
(tests
是原始列表,domain
是可能的元素数组)
var sourceElements = tests.SelectMany(test => test.Lists);
这将为每个测试获取Lists
属性,并将所有结果结合在一起,因此在您的示例中,结果为
["A", "B", "A", "C", "C"]
您可以使用Distinct
仅获取唯一的商品,因此代码为
var sourceElements = tests.SelectMany(test => test.Lists).Distinct();
现在,剩下要做的就是找到domain
中的项目,而不是sourceElements
中的项目,即它们的设置差异。使用Except
方法很容易做到这一点。
var missing = domain.Except(sourceElements);
因此,要将所有内容放在一起,您的方法应为:
private static IEnumerable<string> FindMissingElements(
IEnumerable<Test> tests, IEnumerable<string> domain)
{
var sourceElements = tests.SelectMany(test => test.Lists).Distinct();
var missing = domain.Except(sourceElements)
return missing;
}
Here是一个有效的示例。
答案 2 :(得分:0)
我认为这可以为您提供帮助
var list1 = new string[] { "A", "B", "C", "D" }
var nonExistentElements = new List<string>(list1);
obj.ForEach(o => nonExistentElements = nonExistentElements.Except(o.Lists).ToList());
答案 3 :(得分:0)
我尝试这样测试您的问题:
private static List<string> FindeMissingElements()
{
var objectArray = new[] {"A", "B", "C", "D"};
var obj = new List<Test>()
{
new Test() {Lists = new List<string>() { "A", "B" } },
new Test() {Lists = new List<string>() { "A", "C" } },
new Test() {Lists = new List<string>() { "C" } }
};
var missingValues = objectArray.Where(x => !obj.Any(c => c.Lists.Any(v => v == x))).ToList();
return missingValues.any() ? missingValue:missingValue = new List<string>();
}
在1行中,您可以找到缺失值。
祝你好运。