如何根据条件连接列表中的项目

How to concat item in list with condition

我是在 C# 中使用 linq 的初学者。 当引用列表中存在项目的第二个数据时,我想使用 linq 连接列表中的相同项目。 我尝试通过分隔符拆分 select 新列表,但我无法获得预期的结果。

你发现我使用的代码如下:

using System;
using System.Collections.Generic;   
using System.Linq;

public class Program
{   
    List<String> ref_list = new List<String>();
    List<String> new_list = new List<String>();
    String exist_pattern = "|T";
    
    public bool CheckExistData(String data)
    {
        if (ref_list.Any(item => item == data))
            return true;
        return false;
    }
    
    public void Main()
    {
        ref_list.Add("X2014");
        ref_list.Add("PN14");
        
        new_list.Add("new|P7787");
        new_list.Add("data|987AA");
        new_list.Add("pnal|PN14");
        new_list.Add("mapping|884AW");
        new_list.Add("larou|X2014");
        new_list.Add("data2|PAWLL");
        
        new_list= new_list.Select(r => string.Concat(r, "|T")).Where(s=> CheckExistData(s.Split('|')[1])).ToList();
            
    }
}

预期结果:

new|P7787
data|987AA
pnal|PN14|T
mapping|884AW
larou|X2014|T
data2|PAWLL

我认为对于你的情况,for loop 比 linq 更合适。 linq 是一种查询 语言,但您想更新 原始列表。

            for (int i = 0; i < new_list.Count; i++)
            {
                string item = new_list[i];
                string[] parts = item.Split(new char[] { '|' });
                //assert parts.Length == 2
                if (ref_list.Contains(parts[1]))
                {
                    new_list[i] = item + exist_pattern;
                }
            }

如果您真的需要 linq,请查看代码。 但我真的认为第一种方法更好、更直接且可维护。

  1. linq 方式重新创建所有项目,想想如果你有数百万个项目,但只有一个项目匹配,性能会更差。
  2. 如果您在检查中有其他逻辑而不仅仅是 Contains,超过 truefalse,那么在不引入第三个(包括匿名) 类型或函数。
            new_list = new_list
                .Select(x => ref_list.Contains(x.Split(new char[] { '|' })[1])
                ? x + exist_pattern
                : x)
            .ToList();

如果你想使用linq,你可以把它写到Select部分

new_list = new_list.Select(l => CheckExistData(l.Split('|')[1]) ? l+exist_pattern : l).ToList();