在复杂对象中查找项目

时间:2018-06-30 10:27:40

标签: c# linq

我有一系列元素 字符串[]:

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 ...

4 个答案:

答案 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)

首先,我将把源展平到一个列表中,以便收集实际值。为此,最好使用SelectManytests是原始列表,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行中,您可以找到缺失值。

祝你好运。