使用 LINQ 在两个列表之间"Left XOR"



我必须收集:

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"元素的字段中。有点像"左异或"(左边是因为两个列表元素中只有一个会被添加而没有对应关系到另一个表中)。

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

我已经写了这个,但它似乎不起作用,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 中没有解释,但如果您查看源代码就很清楚了),因此,如果您在 pIsinListnew[] { "A", "A" },最终结果将是单个"A"

您可以"手动"执行Except来解决此"问题"(如果是问题):

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

第二个列表中的Contains

var result = diplayedBondsList
    .Where(l => !pIsinList.Contains(l.isin))
    .Select(l => l.isin)
    .ToList();

我认为速度无法提高,因为无论使用哪种方法,您始终必须将一个列表中的所有项目与另一个列表中的所有项目进行比较。即使你删除了循环,Linq 也必须在引擎盖下做一个(或几个)。

两个列表之间有一个 XOR、左 XOR 或右 XOR 的扩展名:https://stackoverflow.com/a/45480272/2546739

(它不在 LINQ 中)

相关内容

  • 没有找到相关文章

最新更新