使用Linq从HashSet中删除

时间:2017-09-06 02:34:32

标签: c# linq

我有一个字符串的字典和字符串的HashSet,想要删除那些具有另一个的元素,反之亦然:

这是工作示例

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <script id="sap-ui-bootstrap" type="text/javascript" src="https://openui5.hana.ondemand.com/resources/sap-ui-core.js" data-sap-ui-libs="sap.m" data-sap-ui-theme="sap_belize" data-sap-ui-xx-bindingSyntax="complex">
    </script>

    <script id="view1" type="sapui5/xmlview">
        <mvc:View xmlns="sap.m" xmlns:mvc="sap.ui.core.mvc" xmlns:core="sap.ui.core">
          <DateTimePicker value="20170909103032" valueFormat="yyyyMMddHHmmss" displayFormat="MM dd, yyyy HH:mm a" />
        </mvc:View>
    </script>
    <script>
        var myView = sap.ui.xmlview({
            viewContent: jQuery('#view1').html()
        }); // accessing the HTML inside the script tag above


        myView.placeAt('content');
    </script>

</head>

<body id='content' class='sapUiBody'>
</body>

</html>

如何使用Linq做到这一点?

这是输入

var squad = new Dictionary<string, HashSet<string>>();

foreach (var curr in squad.Keys)
{
      foreach (var creature in squad.Keys)
      {
          if (squad[curr].Contains(creature)
               && squad[creature].Contains(curr))
          {
               squad[curr].Remove(creature);
               squad[creature].Remove(curr);
          }
      }
}

以下是输出

Mozilla -> Tony
Tony -> Godzilla
Mozilla -> Dony
Tony -> Franzilla
Mozilla -> Mony
Tony -> Mozilla
Blaze it!

整个代码:

Mozilla : 2
Tony : 2

就像Linq一样,我很想知道是否有办法在Linq中改变这一点,或者只是以更聪明/更好的方式改变它?

1 个答案:

答案 0 :(得分:1)

我无法弄清楚这段代码应该做什么。

虽然样本数据&amp;输出可能对您有意义,将输入更改为Mozilla -> Dony产生Mozilla : 1的一个条目,这与您对其目的的描述不符。

无论如何,你的问题是关于LINQ&amp;用它来删除元素。

这是对LINQ底层范式的基本误解。

首先,LINQ基于IEnumerable,它是一个只读的仅向前迭代器。 您无法从迭代器中删除项目。

其次,LINQ是一种函数式编程范例。 LINQ查询表示序列的不可变投影。这个词,“不可变的”,在函数式编程中非常重要。你正在思考,你有一个你要变异的序列,删除项目,然后使用新的变异序列。功能编程表示改变seqeunce是不好的,所以宁可从原始序列投射新序列,然后使用投影序列。您仍然可以获得相同的输出,但最终的原始序列将完好无损。