-4

我有两个列表:(注意:列表的项目是 "NAME" 和 "ID" 的组合)

List<string> ListA = new List() {"SAM001","SAM002","SAM003","PIT001","PIT002","PIT004","ROSE001","ROSE002","JASE001" };
//so on

List<string> ListB = new List() {"SAM001","SAM003","PIT000","ROSE002","JASE001","INDI000"};` 
//so on...

现在基于这两个列表,我想创建两个新列表,假设 listCommon 和 listUncommon。

listCommon 将包含 ListA 和 ListB 的所有匹配项。

listUnCommon 将包含 ListA 的所有剩余项目

现在我的条件是,如果 ListB 中的任何项目都有 NAME + 000,那么以该名称开头的 ListA 的所有项目都应该添加到我的 listCommon 中。

示例 1:如果 ListB 项目是 PIT000 并且 ListA 项目是 PIT001,PIT002,PIT003,ABC001 那么 listCommon = PIT001,PIT002,PIT003 因为 ListB 的 PIT 为 000 所以条件为真所有 ListA 'PIT' 项目添加到 listcommon

因此,如上面的列表和我的情况,我想要下面的最终列表

List<string> listCommon = new List() {"SAM001","SAM003", "PIT001","PIT002","PIT004","ROSE002", "JASE001" };
List<string> listUncommon = new List() {"SAM002", "ROSE001"};

请建议..我只是在循环中花费了几分钟,但没有得到我提到的实际结果:(

4

2 回答 2

4

这应该有效。

var common = ListA.Intersect(ListB)
    .Concat(
        ListA.Where(a => 
             ListB.Any(
                b => b.EndsWith("000") && 
                b.StartsWith(a.Substring(0, a.Length - 3))
             )
        )
    );
var uncommon = ListA.Except(common);

使用插入,然后您从列表 A 中选择任何一个,其中列表 B 有一个匹配前 3 个字母并以 000 结尾的条目。

这不是最有效的方法,但它在代码方面很简洁。

于 2012-10-05T20:42:10.927 回答
0

从 2 个列表中查找常见项目:

var listCommon = list1.Intersect(list2);

更新 - 减去的项目:

var subtractedItems = new HashSet(listCommon);
commonItems.ExceptWith(list1);
于 2012-10-05T20:35:47.940 回答