如何根据条件连接列表中的项目
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,请查看代码。
但我真的认为第一种方法更好、更直接且可维护。
- linq 方式重新创建所有项目,想想如果你有数百万个项目,但只有一个项目匹配,性能会更差。
- 如果您在检查中有其他逻辑而不仅仅是
Contains
,超过 true
或 false
,那么在不引入第三个(包括匿名) 类型或函数。
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();
我是在 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,请查看代码。 但我真的认为第一种方法更好、更直接且可维护。
- linq 方式重新创建所有项目,想想如果你有数百万个项目,但只有一个项目匹配,性能会更差。
- 如果您在检查中有其他逻辑而不仅仅是
Contains
,超过true
或false
,那么在不引入第三个(包括匿名) 类型或函数。
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();