linq C#:将数据添加到字典

w1jd8yoj  于 2023-09-28  发布在  C#
关注(0)|答案(5)|浏览(150)

我有一个清单

List<string> TempList = new List<string> { "[66,X,X]", "[67,X,2]", "[x,x,x]" };

我需要从上面的列表中添加数据到字典中

Dictionary<int, int> Dict = new Dictionary<int, int>();

所以字典里应该有

Key --> 66 value --> 67

我需要从第一个字符串([66,X,X])中取66(第一个值),从第二个字符串([67,X,X])中取67(第一个值),并将其作为键值对添加到字典中。
现在,我将遵循字符串替换和循环方法来完成此操作。
在LINQ或正则表达式中有什么方法可以做到这一点吗?

9cbw7uwe

9cbw7uwe1#

在你说你是从一个列表的列表开始之后,我明白了你在追求什么。我在这里重用了Jaroslav的'GetNumber'函数。我写了我的样本与数组的数组的字符串,但应该工作一样.如果你有重复的键,下面的代码将抛出,我假设这是你想要的,如果你使用字典。

var input = new []
                        {
                            new [] { "[66,X,X]", "[67,X,2]", "[x,x,x]" },
                            new [] { "[5,X,X]", "[8,X,2]", "[x,x,x]" }
                        };

        var query = from l in input
                    select new 
                    {
                     Key = GetNumber(l.ElementAt(0)), 
                     Value = GetNumber(l.ElementAt(1))
                     };

        var dictionary = query.ToDictionary(x => x.Key, x => x.Value);
wribegjk

wribegjk2#

下面是一个同时使用string.Split()和Regex的例子:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> data = new List<string>() { "[66,X,X]", "[67,X,2]", "[x,x,x]" };
            addToDict(data);

            Console.ReadKey();
        }

        private static void addToDict(List<string> items)
        {
            string key = items[0].Split('[', ',')[1];
            string val = items[1].Split('[', ',')[1];

            string pattern = @"(?:^\[)(\d+)";
            Match m = Regex.Match(items[0], pattern);
            key = m.Groups[1].Value;
            m = Regex.Match(items[1], pattern);
            val = m.Groups[1].Value;

            _dict.Add(key, val);
        }

        static Dictionary<string, string> _dict = new Dictionary<string, string>();
    }
}

我怀疑你的例子是相当做作的,所以可能有一个更好的解决方案,特别是如果你需要将大量的字符串处理成键/值对(我故意硬编码索引值,因为你的例子很简单,我不想让答案过于复杂)。如果输入数据在格式上是一致的,那么你可以做出假设,比如使用固定的索引,但是如果存在一些差异的可能性,那么可能需要更多的代码来检查它的有效性。

3hvapo4f

3hvapo4f3#

您可以使用正则表达式从列表中的每个项目中提取值,如果需要,可以使用LINQ选择两个列表并将它们压缩在一起(在C# 4.0中):

var regex      = new Regex(@"\d+");
var allValues  = TempList.Select(x =>int.Parse(regex.Match(x).Value));
var dictKeys   = allValues.Where((x,index)=> index % 2 == 0); //even-numbered 
var dictValues = allValues.Where((x,index)=> index % 2 > 0); //odd numbered 
var dict       = dictKeys.Zip(dictValues, (key,value) => new{key,value})
                         .ToDictionary(x=>x.key,x=>x.value);

如果你使用的是C# 3.5,你可以使用Eric Lippert's implementation of Zip()

kqqjbcuj

kqqjbcuj4#

如果我理解正确:你想创建像66 -> 67, 67 -> 68, ... n -> n+1这样的链接节点吗?
我不会使用LINQ:

private static int GetNumber(string s)
{
    int endPos = s.IndexOf(',');
    return Int32.Parse(s.Substring(1, endPos-1));
}

在代码中:

int first, second;    
for (int i = 1; i < TempList.Count; i++)
{
    first = GetNumber(TempList[i - 1]);
    second = GetNumber(TempList[i]);

    Dict.Add(first, second);
}

您还应该执行检查等。
示例假定列表中至少包含2个项。

eagi6jfj

eagi6jfj5#

List<List<string>> source = GetSource();

Dictionary<int, int> result = source.ToDictionary(
  tempList => GetNumber(tempList[0]),
  tempList => GetNumber(tempList[1])
);

相关问题