Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果元素计数小于',则删除数组中的所有类似元素;n';_C#_Arrays - Fatal编程技术网

C# 如果元素计数小于',则删除数组中的所有类似元素;n';

C# 如果元素计数小于',则删除数组中的所有类似元素;n';,c#,arrays,C#,Arrays,我有一个包含数千个元素的数组,其中许多是其他元素的副本。我需要的是找到数组中'foo'元素计数的方法,如果小于'n',则从数组中删除'foo'的所有元素 我需要的例子 string[] words = new string[] int n = 8; int k = Occurances of "foo" in words; if (k < n) { //Remove all occurances of 'foo' in the array } 结果将是数组中剩下的以下内容,因为只

我有一个包含数千个元素的数组,其中许多是其他元素的副本。我需要的是找到数组中'foo'元素计数的方法,如果小于'n',则从数组中删除'foo'的所有元素

我需要的例子

string[] words = new string[]
int n = 8;
int k = Occurances of "foo" in words;
if (k < n) {
    //Remove all occurances of 'foo' in the array
}
结果将是数组中剩下的以下内容,因为只找到了7种“foo”,但找到了9种“bar”

{"bar","bar","bar","bar","bar","bar","bar","bar","bar"}

感谢您提供的任何帮助

您可以使用
LINQ
GroupBy
Count
来实现:

string[] words = new string[] { "foo", "foo", "foo", "foo", "foo", "foo", "foo", "bar", "bar", "bar", "bar", "bar", "bar", "bar", "bar", "bar" };
int n = 8;
var groups = words.GroupBy(x => x).Where(g => g.Count() >= n);
这里您要做的是根据元素值(foo group和bar group)对元素进行分组,然后对每个组进行计数,得到元素数量大于某个阈值的组(在本例中n=8)

要恢复阵列,只需使用
SelectMany
,再前进一点即可:

string[] filteredWords = words.GroupBy(x => x).Where(g => g.Count() >= n)
    .SelectMany(g => g).ToArray();

这将起作用,并保留元素的原始顺序

var words = new[]
{
    "foo", "foo", "foo", "foo", "foo",
    "foo", "foo", "bar", "bar", "bar",
    "bar", "bar", "bar", "bar", "bar",
    "bar"
};

var keepers = new HashSet<string>(
    words.ToLookup(x => x).Where(x => x.Skip(7).Any()).Select(x => x.Key));

words = words.Where(w => keepers.Contains(w)).ToArray();


根据您的评论,“是否可以将其进一步扩展,并检查字符串部分的出现情况?”,我假设您的意思是,您希望计算“单词”部分的单独频率,并保留整个“单词”,如果它满足频率要求。这可能不太清楚。这是我的密码:

var words = new[]
{
    "foo", "foo", "foo extrabits", "foo", "foo",
    "foo", "foo", "bar", "bar", "bar",
    "bar", "bar", "bar extrabits", "bar", "bar",
    "bar"
};

var keepers =
    new HashSet<string>(
        words
            .SelectMany(x => x.Split(' '))
            .ToLookup(x => x)
            .Where(x => x.Skip(7).Any())
            .Select(x => x.Key));

words =
    words
        .Where(x => x.Split(' ').Any(y => keepers.Contains(y)))
        .ToArray();
var words=new[]
{
“foo”、“foo”、“foo额外比特”、“foo”、“foo”,
“foo”、“foo”、“bar”、“bar”、“bar”,
“bar”、“bar”、“bar附加位”、“bar”、“bar”,
“酒吧”
};
var保持器=
新哈希集(
话
.SelectMany(x=>x.Split(“”))
.ToLookup(x=>x)
.Where(x=>x.Skip(7).Any())
.选择(x=>x.Key));
言语=
话
。其中(x=>x.Split(“”)。任何(y=>keepers.Contains(y)))
.ToArray();
这将产生:

bar bar bar bar bar bar extrabits bar bar bar 酒吧 酒吧 酒吧 酒吧 酒吧 条附加位 酒吧 酒吧 酒吧
@Hendry我曾尝试将内容转储到
字典中
,获取字典中每个元素的计数,然后相应地删除,但前后转换不正确,是一个普遍问题。元素的原始顺序重要吗?这很好,但它将结果保留为
i分组
。如何将其转换回数组?您可以使用
SelectMany
进行更多操作,我将更新我的答案。这正是我要找的!现在是否可以进一步扩展它,并检查字符串部分中的发生情况?例如,我可能有“foo extrabits”和“bar extrabits”,我可以使用您的方法检查字符串的foo和bar吗?在这种情况下,您应该有双进程。。但这取决于您希望
检查的行为。例如,“字符串的出现”可能意味着两件不同的事情:(1)“boa”出现在“吹嘘”中;(2)“boa”不出现在“吹嘘”中,但在“boa snake”中,是否可以进一步扩展这一点,并检查字符串部分的出现情况?例如,我可能有“foo-extrabits”和“bar-extrabits”,我能用你的方法检查字符串的foo和bar吗?@CocoaMix86-是的,你可以很容易地用
.Split(“”)
来完成。在
.ToLookup(…)
之前选择many(…)
var words = new[]
{
    "foo", "foo", "foo extrabits", "foo", "foo",
    "foo", "foo", "bar", "bar", "bar",
    "bar", "bar", "bar extrabits", "bar", "bar",
    "bar"
};

var keepers =
    new HashSet<string>(
        words
            .SelectMany(x => x.Split(' '))
            .ToLookup(x => x)
            .Where(x => x.Skip(7).Any())
            .Select(x => x.Key));

words =
    words
        .Where(x => x.Split(' ').Any(y => keepers.Contains(y)))
        .ToArray();
bar bar bar bar bar bar extrabits bar bar bar