根据前6个字符合并两个列表

时间:2018-09-06 04:04:41

标签: c# list character union

我有两个列表(“当前”和“新”)。 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个字符合并两个不重复的列表的建议,将不胜感激。

2 个答案:

答案 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