使用linq从不同类型的目标集合中的源集合中查找特定值

时间:2012-11-28 20:19:18

标签: c# linq

我想知道在Name属性标识的targetList中包含分号后的一个sourceList值。如果这是真的,则必须返回bool值。

它没有用,但我尝试了一些......

我猜我的linq不正确。所有的东西......

" FoundSomething"包含在targetList中,因此它应该返回TRUE。

var sourceList = new String[]
{ 
    "1;HideButton",
    "2;ShowButton",
    "3;HideButton",
    "4;ShowButton",
    "5;HideButton",
    "6;ShowButton",
    "7;HideButton",
    "8;ShowButton",
    "9;HideButton",
    "10;FoundSomething",
};

var targetList = new List<GlobalConfiguration>()
{
    new GlobalConfiguration{ Name = "444" },
    new GlobalConfiguration{ Name = "fdsdffd" },
    new GlobalConfiguration{ Name = "44" },
    new GlobalConfiguration{ Name = "fsdd" },
    new GlobalConfiguration{ Name = "fs4rtref" },
    new GlobalConfiguration{ Name = "ftrtras" },
    new GlobalConfiguration{ Name = "FoundSomething" },
};

Boolean exists = sourceList.Any(a => targetList.All(c => c.Name == a.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries).Last()));

3 个答案:

答案 0 :(得分:1)

我不是百分百肯定我理解你的目标,但这是我最好的猜测:

sourceList
    .Select(x => x.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries).Last())
    .Intersect(targetList.Select(x => x.Name))
    .Any();

这样做会产生两个序列

  1. sourceList的后半部分(分号后)
  2. targetList
  3. 的名称属性

    Select

    然后它使用Intersect返回两个序列共有的任何项目。

    最后,它使用Any来确定是否从Intersect返回了任何内容(我认为这很容易理解)。

答案 1 :(得分:0)

看起来你想要另一个Any而不是All

bool exists = sourceList
    .Select(s => s.Split(new[] { ';' }, StringSplitOption.RemoveEmptyEntries).Last())
    .Any(v => targetList.Any(t => s == t.Name));

答案 2 :(得分:0)

你基本上有两套,你想看看它们的交集是否为空。你应该这样做,这要归功于方便的Intersect扩展方法。

var source = sourceList.Select(s=>s.Split(';')[1]);
var target = targetList.Select(t=>t.Name);

return source.Intersect(target).Count() > 0;