使用IEnumerable <string>作为参数从IEnumerable获取数据

时间:2017-04-15 16:35:36

标签: c# linq ienumerable

我有一个类型

public class One
{
    public string firstString { get; set; }
    public string secondString { get; set; }
}

和IEnumerable:

IEnumerable<One> firstIEnumerable;

在程序执行期间,我得到另一个IEnumerable,

IEnumerable<string> secondIEnumerable = List<string>.Where(...);

我想要的是使用firstIEnumerable secondString成员之间的平等以及来自{{1的任何值}请求firstIEnumerable firstString secondIEnumerable }}

我想象一个这样的命令:

IEnumerable<string> thirdIEnumerable =
    firstIEnumerable.Where(m=>m.firstString == secondIEnumerable.? ? ? ? ?).secondString; 

但它没有编译。

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望<{>>选择 secondString firstStringsecondIEnumerable 包含的每个项目:var result = firstIEnumerable.Where(item => secondIEnumerable.Contains(item.firstString)) .Select(item => item.secondString);

var result = from item in firstIEnumerable
             where secondIEnumerable.Contains(item.firstString)
             select item.secondString;

查询语法可能更好:

f.ShowCodes = true;
para.Range.InsertAfter("\r\n");

答案 1 :(得分:1)

也许你可以使用它:

        IEnumerable<string> thirdEnumerable =   from firstItem in firstIEnumerable
                                                from secondItem in secondIEnumerable
                                                where firstItem.firstString == secondItem
                                                select firstItem.firstString;

或者这种内联方式:

IEnumerable<string> thirdEnumerable2 = firstIEnumerable.Select(x => x.firstString).Intersect(secondIEnumerable);

答案 2 :(得分:1)

如果第二个可枚举是一个长序列,你可能(检查基准)最好做两次传递并创建一个哈希集,而不是做O(N * M)算法。 O(N * M)就是:

first.Where(x => second.Contains(x.firstString)).Select(x => x.secondString)

使用哈希集:

var hashSet = new HashSet<string>(second);
first.Where(x => hashSet.Contains(x.firstString)).Select(x => x.secondString)

第二种选择可能会在大多数情况下提供更好的性能。