微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用LINQ将值列表与对象列表的属性进行比较

如何解决使用LINQ将值列表与对象列表的属性进行比较

我无法使用Linq比较两个列表。
我的第一个列表包含对象实例,该对象实例包含感兴趣的属性,可以与仅包含值的第二个列表进行比较。
说我们有:

List<uint> referenceValues = new List<uint>(){1,2,3};
and
List<SomeObject> myObject= new List<SomeObject>();

现在SomeObject()类具有uint类型的“ Value”属性
请注意,“ myObject”列表可能包含比“ referenceValues”列表更多的元素,因此我们必须选择“ myObject”的适当部分与“ referenceValues”进行比较。

我发现了以下相关的堆栈溢出问题,但与我所追求的不完全相同:link

这是我到目前为止尝试过的,但是没有成功:

if (myObject
    .GetRange((int)offset,count)       // Extracted the object of interest from the list
    .Where(x => referenceValues.Equals(x.Value)).Count() == 0)   // Comparing the "Value" properties against the "referenceValues"
{
    // Do something
}

我认为我需要以某种方式使用“ SequenceEqual”,但我并没有真正使用它。
任何建议都将受到欢迎。

编辑

可复制的示例:

using System;
using System.Linq;
using System.Collections.Generic;
                    
public class Program
{
    public static void Main()
    {
        int offset = 0;
            
        List<uint> referenceValues = new List<uint>(){1,3};

        List<SomeObject> myObject= new List<SomeObject>(){new SomeObject(){Value=1},new SomeObject(){Value=2},new SomeObject(){Value=3}};
        
        if (myObject
            .GetRange(offset,referenceValues.Count()-1)       // Extracted the object of interest from the list
            .Where(x => referenceValues.Equals(x.Value)).Count() == referenceValues.Count())   // Comparing the "Value" properties against the "referenceValues"
        {
            // Do something
            Console.WriteLine("Lists are matching!");
        }
        else
        {
            Console.WriteLine("Lists are not matching!");
        }
    }
}

public class SomeObject
{
    public uint Value = 0;
}

EDIT2

根据Guru Stron的建议工作的解决方案:

using System;
using System.Linq;
using System.Collections.Generic;
                    
public class Program
{
    public static void Main()
    {
        int offset = 0;
            
        List<uint> referenceValues = new List<uint>(){1,new SomeObject(){Value=3}};
        
        if (myObject.
            GetRange((int)offset,referenceValues.Count())   
            .Select(someObject => someObject.Value)
            .SequenceEqual(referenceValues))
        {
            // Do something
            Console.WriteLine("Lists are matching!");
        }
        else
        {
            Console.WriteLine("Lists are not matching!");
        }
    }
}

public class SomeObject
{
    public uint Value = 0;
}

有关Linq表达式的推荐书:《 LINQ Pocket参考》

解决方法

如果要通过属性来检查myObject值的某些子集是否具有特定的顺序,可以执行以下操作:

bool inOrder = myObject
    .GetRange((int)offset,count)   
    .Select(someObject => someObject.Value)
    .SequenceEqual(referenceValues);

如果您只想检查指定的referenceValues中是否存在所有值,则可以使用All(同样,如果源范围为空,则返回true):

bool allPresent = myObject
    .GetRange((int)offset,count)   
    .All(someObject => referenceValues.Contains(someObject.Value));

对于完整的集合匹配而不需要订购,我不知道开箱即用的解决方案,但是您可以寻找一个here

,
if(myObject.Any(x => referenceValues.Contains(x.Value)) {}

我忽略了GetRange部分,但没有任何区别。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。