【发布时间】:2010-09-20 06:06:16
【问题描述】:
我有一个 List 的 String 喜欢
List<String> MyList=new List<String>{"A","B"};
还有一个
Dictionary<String, Dictionary<String,String>> MyDict=new Dictionary<String,Dictionary<String,String>>();
其中包含
Key Value
Key Value
"ONE" "A_1" "1"
"A_2" "2"
"X_1" "3"
"X_2" "4"
"B_1" "5"
"TWO" "Y_1" "1"
"B_9" "2"
"A_4" "3"
"B_2" "6"
"X_3" "7"
我需要将列表和字典合并到一个新的字典中
Dictionary<String,String> ResultDict = new Dictionary<String,String>()
结果字典包含
Key Value
"A_1" "1"
"A_2" "2"
"B_1" "5"
"A_4" "3"
"B_2" "6"
"X_2" "4"
"X_3" "7"
合并规则
- 首先添加子字符串等于列表中任何项目的项目。
- 然后合并“MyDict”中的项目,这样结果就不应包含重复的键和重复的值。
这是我的源代码。
Dictionary<String, String> ResultDict = new Dictionary<string, string>();
List<String> TempList = new List<string>(MyDict.Keys);
for (int i = 0; i < TempList.Count; i++)
{
ResultDict = ResultDict.Concat(MyDict[TempList[i]])
.Where(TEMP => MyList.Contains(TEMP.Key.Contains('_') == true ? TEMP.Key.Substring(0, TEMP.Key.LastIndexOf('_'))
: TEMP.Key.Trim()))
.ToLookup(TEMP => TEMP.Key, TEMP => TEMP.Value)
.ToDictionary(TEMP => TEMP.Key, TEMP => TEMP.First())
.GroupBy(pair => pair.Value)
.Select(group => group.First())
.ToDictionary(pair => pair.Key, pair => pair.Value); }
for (int i = 0; i < TempList.Count; i++)
{
ResultDict = ResultDict.Concat(MyDict[TempList[i]])
.ToLookup(TEMP => TEMP.Key, TEMP => TEMP.Value)
.ToDictionary(TEMP => TEMP.Key, TEMP => TEMP.First())
.GroupBy(pair => pair.Value)
.Select(group => group.First())
.ToDictionary(pair => pair.Key, pair => pair.Value);
}
它工作正常,但我需要消除两个 for 循环或至少一个 (使用 LINQ 或 LAMBDA 表达式的任何方式)
【问题讨论】:
-
在你的例子中,
MyList不包括"X"那么为什么"X_2"和"X_3"在结果字典中? -
阐明您希望“独特”规则如何工作也很有用。如果两项具有相同的键但不同的值,则应排除一项;如果两个项目具有相同的值但不同的键,应该排除一个;在每种情况下,如果是这样,应该排除哪个项目?也许您可以在示例中包含三个“不同”案例中的每一个的示例?
-
为什么要去掉两个for循环?
-
@Daniel Renshaw:在合并规则 1 中,我提到“首先添加具有等于列表中任何项目的子字符串的项目。”所以在那之后我需要添加其余的元素(没有重复的键或值)
-
@Daniel Renshaw:我需要保留第一个值(键值对)。结果不应包含相同的键或相同的值或相同的键值对。上面的代码工作正常。我需要这样做而不使用 for 循环
标签: c# list dictionary