Спіс Фільтраванне XElements супраць слоўніка

Вось мой файл XML:


  
    LOREM
    IPSUM
    DOLOR
  
  
    LOREM
    AMET
    CONSECTETUER
  
  
    LOREM
    IPSUM
    CONSECTETUER
  

Я хачу, каб атрымаць некаторыя коды запісы на аснове крытэрыяў, якія захоўваюцца на гэтым слоўніку:

{ "info1", "LOREM" }
{ "info2", "IPSUM" }

Я пісаў, што Linq запыт:

var test =  from element in xml.Descendants("item").Elements()
        from param in dicoParams
        where param.Key == element.Name.ToString() && param.Value == element.Value
        select element.Parent.Attribute("code");

але выснова:

code="1"
code="1"
code="2"
code="3"
code="3"

і тое, што я чакаў, гэта:

code="1"
code="3"

Мы можам заўважыць, што запыт вяртаў элементы, якія задавальняюць хоць бы адна ўмова, але я хачу, каб задаволіць абодвум умовам.

Як я мог бы напісаў гэты запыт?

3
@ User1068352 Я думаю, што вы маглі б быць маюць рацыю, абнавіў свой адказ, каб дадаць, што ў якасці опцыі, а таксама.
дададзена аўтар mattytommo, крыніца
@ User1068352 Я думаю, што вы маглі б быць маюць рацыю, абнавіў свой адказ, каб дадаць, што ў якасці опцыі, а таксама.
дададзена аўтар mattytommo, крыніца
@ User1068352 Я думаю, што вы маглі б быць маюць рацыю, абнавіў свой адказ, каб дадаць, што ў якасці опцыі, а таксама.
дададзена аўтар mattytommo, крыніца
Чаму вы не чакаеце 2 ? Гэта адпавядае вашым крытэрам
дададзена аўтар mattytommo, крыніца
Праверце свае дадзеныя. <�Код> Код тавару = "1" адпавядае абодвум запісу.
дададзена аўтар Henk Holterman, крыніца
Калі вы чакаеце 2 адказаў, то, верагодна, запыт Linq павінен быць заснаваны на слоўнік, а не на XML.
дададзена аўтар Henk Holterman, крыніца
Калі вы чакаеце 2 адказаў, то, верагодна, запыт Linq павінен быць заснаваны на слоўнік, а не на XML.
дададзена аўтар Henk Holterman, крыніца
Калі вы чакаеце 2 адказаў, то, верагодна, запыт Linq павінен быць заснаваны на слоўнік, а не на XML.
дададзена аўтар Henk Holterman, крыніца
Праверце свае дадзеныя. <�Код> Код тавару = "1" адпавядае абодвум запісу.
дададзена аўтар Henk Holterman, крыніца
Праверце свае дадзеныя. <�Код> Код тавару = "1" адпавядае абодвум запісу.
дададзена аўтар Henk Holterman, крыніца
@mattytommo Другі элемент не задавальняе ўсім умовам з слоўніка.
дададзена аўтар user1068352, крыніца
@mattytommo Другі элемент не задавальняе ўсім умовам з слоўніка.
дададзена аўтар user1068352, крыніца
@mattytommo Другі элемент не задавальняе ўсім умовам з слоўніка.
дададзена аўтар user1068352, крыніца
ды, user1068352 правоў. Я хачу, каб усе элементы, якія задавальняюць усе ўмовы. На жаль, я не абмовіўся.
дададзена аўтар Harkonnen, крыніца
ды, user1068352 правоў. Я хачу, каб усе элементы, якія задавальняюць усе ўмовы. На жаль, я не абмовіўся.
дададзена аўтар Harkonnen, крыніца
ды, user1068352 правоў. Я хачу, каб усе элементы, якія задавальняюць усе ўмовы. На жаль, я не абмовіўся.
дададзена аўтар Harkonnen, крыніца

7 адказы

Я думаю, што вы чакаеце 2 таксама як 2 ўтрымлівае info1 , які ўтрымлівае Lorem .

Нягледзячы на ​​гэта, я думаю, што гэта тое, што вы шукаеце:

var test =  from element in xml.Descendants("item")
    from param in dicoParams
    where element.Elements()
        .Any(e => e.Name.ToString() == param.Key && e.Value == param.Value)
    select element.Attribute("code");

Гэта будзе выводзіць толькі адзін код, незалежна ад колькасці матчаў.

Actually, as @user1068352 mentions in the comments, it looks like you want items that match ALL items in the dictionary.

Калі гэта так, паспрабуйце гэта:

var test = from element in xml.Descendants("item")
    where dicoParams.All(d => element.Elements
        .Any(e => e.Name.ToString() == d.Key && e.Value == d.Value))
    select element.Attribute("code");
3
дададзена
Вы, верагодна, можа быць нязначным больш эфектыўным, чым O (нм) цыкл па ўсіх элементах і ўсіх элементаў у слоўніку, але я думаю, што другі адказ з'яўляецца логіка ФП пасля.
дададзена аўтар Rawling, крыніца
я пакараны, што ваш адказ і не вяртае вынік. калі ласка, праверце
дададзена аўтар Smaug, крыніца
@Harkonnen я паспрабаваў тое ж самае, але я не мог атрымаць вынік. Гэта становіцца «Памылка 17 Лакальная пераменная з імем" е "не можа быць абвешчаны ў гэтай галіне, таму што гэта дало б іншае значэнне" е ", які ўжо выкарыстоўваецца ў" бацькі або бягучай вобласці бачнасці для абазначэння чагосьці яшчэ »
дададзена аўтар Smaug, крыніца
да .. нарэшце я знайшоў рашэнне. ад элемента ў XML.descendants ( "пункт"), дзе dicoParams.All (г => element.Elements() .Any (яе => ee.Name.ToString() == d.Key && ee.Value == в. Value)) выбярыце element.Attribute ( "код"); й замест е вырашыць гэтую праблему
дададзена аўтар Smaug, крыніца
Ты мой чалавек! Ваша другое рашэнне менавіта тое, што я хачу. Вялікі дзякуй, я змагаўся з гэтым на працягу некалькіх гадзін
дададзена аўтар Harkonnen, крыніца

Я думаю, што вы чакаеце 2 таксама як 2 ўтрымлівае info1 , які ўтрымлівае Lorem .

Нягледзячы на ​​гэта, я думаю, што гэта тое, што вы шукаеце:

var test =  from element in xml.Descendants("item")
    from param in dicoParams
    where element.Elements()
        .Any(e => e.Name.ToString() == param.Key && e.Value == param.Value)
    select element.Attribute("code");

Гэта будзе выводзіць толькі адзін код, незалежна ад колькасці матчаў.

Actually, as @user1068352 mentions in the comments, it looks like you want items that match ALL items in the dictionary.

Калі гэта так, паспрабуйце гэта:

var test = from element in xml.Descendants("item")
    where dicoParams.All(d => element.Elements
        .Any(e => e.Name.ToString() == d.Key && e.Value == d.Value))
    select element.Attribute("code");
3
дададзена
Вы, верагодна, можа быць нязначным больш эфектыўным, чым O (нм) цыкл па ўсіх элементах і ўсіх элементаў у слоўніку, але я думаю, што другі адказ з'яўляецца логіка ФП пасля.
дададзена аўтар Rawling, крыніца
я пакараны, што ваш адказ і не вяртае вынік. калі ласка, праверце
дададзена аўтар Smaug, крыніца
@Harkonnen я паспрабаваў тое ж самае, але я не мог атрымаць вынік. Гэта становіцца «Памылка 17 Лакальная пераменная з імем" е "не можа быць абвешчаны ў гэтай галіне, таму што гэта дало б іншае значэнне" е ", які ўжо выкарыстоўваецца ў" бацькі або бягучай вобласці бачнасці для абазначэння чагосьці яшчэ »
дададзена аўтар Smaug, крыніца
да .. нарэшце я знайшоў рашэнне. ад элемента ў XML.descendants ( "пункт"), дзе dicoParams.All (г => element.Elements() .Any (яе => ee.Name.ToString() == d.Key && ee.Value == в. Value)) выбярыце element.Attribute ( "код"); й замест е вырашыць гэтую праблему
дададзена аўтар Smaug, крыніца
Ты мой чалавек! Ваша другое рашэнне менавіта тое, што я хачу. Вялікі дзякуй, я змагаўся з гэтым на працягу некалькіх гадзін
дададзена аўтар Harkonnen, крыніца

Я думаю, што вы чакаеце 2 таксама як 2 ўтрымлівае info1 , які ўтрымлівае Lorem .

Нягледзячы на ​​гэта, я думаю, што гэта тое, што вы шукаеце:

var test =  from element in xml.Descendants("item")
    from param in dicoParams
    where element.Elements()
        .Any(e => e.Name.ToString() == param.Key && e.Value == param.Value)
    select element.Attribute("code");

Гэта будзе выводзіць толькі адзін код, незалежна ад колькасці матчаў.

Actually, as @user1068352 mentions in the comments, it looks like you want items that match ALL items in the dictionary.

Калі гэта так, паспрабуйце гэта:

var test = from element in xml.Descendants("item")
    where dicoParams.All(d => element.Elements
        .Any(e => e.Name.ToString() == d.Key && e.Value == d.Value))
    select element.Attribute("code");
3
дададзена
Вы, верагодна, можа быць нязначным больш эфектыўным, чым O (нм) цыкл па ўсіх элементах і ўсіх элементаў у слоўніку, але я думаю, што другі адказ з'яўляецца логіка ФП пасля.
дададзена аўтар Rawling, крыніца
я пакараны, што ваш адказ і не вяртае вынік. калі ласка, праверце
дададзена аўтар Smaug, крыніца
@Harkonnen я паспрабаваў тое ж самае, але я не мог атрымаць вынік. Гэта становіцца «Памылка 17 Лакальная пераменная з імем" е "не можа быць абвешчаны ў гэтай галіне, таму што гэта дало б іншае значэнне" е ", які ўжо выкарыстоўваецца ў" бацькі або бягучай вобласці бачнасці для абазначэння чагосьці яшчэ »
дададзена аўтар Smaug, крыніца
да .. нарэшце я знайшоў рашэнне. ад элемента ў XML.descendants ( "пункт"), дзе dicoParams.All (г => element.Elements() .Any (яе => ee.Name.ToString() == d.Key && ee.Value == в. Value)) выбярыце element.Attribute ( "код"); й замест е вырашыць гэтую праблему
дададзена аўтар Smaug, крыніца
Ты мой чалавек! Ваша другое рашэнне менавіта тое, што я хачу. Вялікі дзякуй, я змагаўся з гэтым на працягу некалькіх гадзін
дададзена аўтар Harkonnen, крыніца

Нешта, як гэта павінна працаваць:

var test =
    from element in xml.Descendants("item")
    where element.Elements()
        .Any(x =>
            dicoParams.ContainsKey(x.Name.ToString())
            && dicoParams[x.Name.ToString()] == x.Value)
    select element.Attribute("code");

Але, як ужо адзначаўся элемент "2" адпавядае з дадзенымі прадастаўленых вамі.

0
дададзена

Нешта, як гэта павінна працаваць:

var test =
    from element in xml.Descendants("item")
    where element.Elements()
        .Any(x =>
            dicoParams.ContainsKey(x.Name.ToString())
            && dicoParams[x.Name.ToString()] == x.Value)
    select element.Attribute("code");

Але, як ужо адзначаўся элемент "2" адпавядае з дадзенымі прадастаўленых вамі.

0
дададзена
 var test1 = (from element in elem.Descendants().Elements()
                         from item in val
                         where item.Key == element.Name.ToString() && item.Value == element.Value
                         select element.Parent.Attribute("code")).GroupBy(t => t.Parent.Attribute("code"));

Вы можаце проста выкарыстоўваць групу занадта

0
дададзена
 var test1 = (from element in elem.Descendants().Elements()
                         from item in val
                         where item.Key == element.Name.ToString() && item.Value == element.Value
                         select element.Parent.Attribute("code")).GroupBy(t => t.Parent.Attribute("code"));

Вы можаце проста выкарыстоўваць групу занадта

0
дададзена