我有两个列表(“当前”和“新”)。 Current可以包含100,000+个字符串,每个字符串都以一个唯一的数字开头。 New可以包含50到200个字符串,每个字符串都有一个唯一的数字。
如果New包含以相同的6个字符开头的字符串,则应替换Current中的相同条目。当前不存在但新中存在的所有新条目都应添加到当前中。我考虑过Union,Concat和Intersect,但是每个都只处理整个字符串。
有什么方法可以只比较列表中项目的前6个字符,如果在“新建”中找到该条目,则替换“当前”中的条目?
也许可视化以上内容的最简单方法是:
当前
123456 66 Park Avenue Sydney
新
123456 88 River Road Sydney
当前的结果必须为
123456 88 Park Avenue Sydney
如果可以使用Current.Union(New, first X characters)
,那就太完美了。
任何有关根据前6个字符合并两个不重复的列表的建议,将不胜感激。
答案 0 :(得分:0)
string.StartsWith是您要寻找的东西。
答案 1 :(得分:-1)
这应该做到。注意我使用了两个字典,因为可能有重复项要替换,否则,您可以使用一个。
public static void Coder42(List<string> current, IEnumerable<string> news)
{
Dictionary<string, string> newDict = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
Dictionary<string, string> unfound = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
foreach (var n in news)
{
if (n.Length < 6) throw new Exception("Too short");
var ss = n.Substring(0, 6);
if (newDict.ContainsKey(ss)) throw new Exception("Can't be too new.");
newDict[ss] = n;
unfound[ss] = n;
}
for (int i = 0; i < current.Count; i++)
{
var s = current[i];
if (s.Length >= 6)
{
var ss = s.Substring(0, 6);
if (newDict.TryGetValue(ss, out string replacement))
{
current[i] = replacement;
unfound.Remove(ss);
}
}
}
foreach(var pair in unfound)
current.Add(pair.Value);
}
并使用以下方法进行了测试:
var current = new List<string>();
current.Add("123456 a");
current.Add("123457 b");
current.Add("123458 c");
var news = new List<string>();
news.Add("123457 q");
news.Add("123456 p");
news.Add("123459 z");
Coder42(current, news);
foreach (var s in current) Console.WriteLine(s);
Console.ReadLine();
礼物:
123456 p
123457 q
123458 c
123459 z