c# - 两个列表之间的 "Left XOR"LINQ

标签 c# linq ienumerable

我要收藏:

IEnumerable<lineResult> diplayedBondsList

List<string> pIsinList

lineResult 是一个非常简单的类,定义为:

public class lineResult
{
    public string isin { get ; set ; }
    public double rate { get ; set ; }
    public string issuer { get ; set ; }
}

我正在尝试使用 pIsinList 中的字符串创建一个新列表,但前提是它们不在 diplayedBondsList 的“lineResult”元素的字段 isin 中。一种“左异或”(左,因为只有两个列表元素之一将被添加而另一个表中没有对应关系)。

我尽量不使用太多循环,因为我的列表有大量数据,我认为这会降低程序速度。

我已经写了这个,但它似乎不起作用,newBondLines 总是空的:

IEnumerable<lineResult> newBondLines = diplayedBondsList.Where(item => pIsinList.IndexOf(item.isin) < 0);

foreach (lineResult lr in newBondLines)
{
    newIsinList.Add(lr.isin);
}

此外,我确实使用了一个循环,也许我可以使用一个不错的 LINQ 语句来避免它。

我怎样才能 1) 让这个“左异或”工作并 2) 提高它的速度?

最佳答案

使用Enumerable.Except:

List<string> xorred = pIsinList.Except(
    diplayedBondsList.Select(x => x.isin)).ToList();

请注意,此命令将在 pIsinList 上隐式执行 Distinct()(MSDN 中未对此进行解释,但如果您查看 source 是很清楚),所以如果你在 pIsinList 中有 new[] { "A", "A"},最终结果将是一个 "A"

您可以“手动”执行 Except 来解决这个“问题”(如果这是一个问题):

var set = new HashSet<string>(diplayedBondsList.Select(x => x.isin));
List<string> xorred = pIsinList.Where(x => !set.Contains(x)).ToList();

关于c# - 两个列表之间的 "Left XOR"LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30891608/

相关文章:

c# - Roslyn - 从 yield'ed IEnumerable<T> 创建一个 SeparatedList<T>

c# - 替代在 IAsyncEnumerable 中产生

c# - 使用 IEnumerable 接口(interface)是否可以减少并发问题

c# - 如何使用超过 8 个值的 System.HashCode.Combine?

c# - Task.Factory.StartNew 与新任务

c# - 将包含驱动器号的相对路径转换为 ​​.NET 文件函数的绝对路径

c# - 创建用于访问泛型类型属性的表达式树

c# - 将 Window.Title 绑定(bind)到 Application 方法

C# Linq 与柯里化(Currying)

c# - Lambda 表达式和 || Entity Framework 中的运算符